【问题标题】:Advantage of using trailing return type in C++11 functions在 C++11 函数中使用尾随返回类型的优势
【发布时间】:2019-02-05 19:07:40
【问题描述】:

与普通返回类型相比,在 C++11 中指定尾随返回类型有什么好处?在此处查看foo1foo2

int foo1() {
    return 1;    
}

auto foo2() -> int {
    return 1;    
}

int main() {
    foo1();
    foo2();
}

【问题讨论】:

  • 非常相似的问题在这里:stackoverflow.com/questions/15737223/…
  • 当您开始使用返回类型不同的模板函数时,您将了解 auto 的用处。
  • @rustyx 我问的是 C++11 而不是 C++14,有区别
  • 你觉得有什么不同?
  • @rustyx,在 C++14 中我可以使用 auto foo2() 并且从返回值中扣除返回类型,在 C++11 中我认为这是不可能的。

标签: c++ c++11 auto trailing-return-type


【解决方案1】:

在本例中,它们的含义完全相同。

但是,始终如一地使用尾随返回类型形式有一些优势(Phil Nash 将这些称为 "East End Functions",因为返回类型位于东端)。

  1. 使用参数。显然,当使用参数来确定返回类型时,您必须使用尾随返回类型。

     template <typename T>
     auto print(T const& t) -> decltype(std::cout << t) { return std::cout << t; }
    
  2. 名称查找。在尾随返回类型中,名称查找包括成员函数定义的类范围。这意味着如果您想返回嵌套类,则不必重新键入该类:

     Type C::foo() { ... }         // error: don't know what Type is
     C::Type C::foo() { ... }      // ok
    
     auto C::foo() -> Type { ... } // ok
    
  3. 同样,对于定义成员函数,由于某种原因,类名必须在全局命名空间中消除歧义,并且返回类型是类:

     D ::C::foo() { ... }         // error, parsed as D::C::foo() { ... }
    
     auto ::C::foo() -> D { ... } // ok
    

在某些情况下尾随返回类型是强制性的,在某些情况下它很有帮助,在某些情况下它会做同样的事情。除了字符数以外,没有比这更糟糕的情况了。

另外,从数学上讲,我们习惯于将函数视为A -&gt; B 而不是B(A),因此auto(*)(A) -&gt; B 作为一个函数指针接受一个A 并返回一个B 更接近一点比B(*)(A) 更喜欢那个观点。


另一方面,写auto main() -&gt; int 看起来很可笑。

但老实说,这主要是因为不熟悉。它本身并没有什么可笑的。如果有的话,有点不幸的是,该语言在这里使用auto 作为声明函数的一种方式——不是因为它太长(即其他一些语言使用fun 甚至fn)——而是因为它并不是真正不同的来自auto 的其他用途。如果改为func,我认为会更好(尽管现在更改没有任何意义)。


最终,这纯粹是基于意见。只需编写有效的代码即可。

【讨论】:

  • 使用auto 作为返回类型的一个美学原因是,对于声明,它可以很好地对齐函数和方法名称。在阅读较新的代码时,我发现它在实践中有些用处。
猜你喜欢
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2013-05-15
  • 2020-09-13
  • 2020-05-12
  • 2013-06-12
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多