24

与普通返回类型相比,在 C++11 中指定尾随返回类型有什么优势?看这里的foo1vs foo2

int foo1() {
    return 1;    
}

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

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

1 回答 1

27

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

但是,始终使用尾随返回类型形式有一些优点(Phil Nash 将这些称为“东端函数”,因为返回类型位于东端)。

  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 -> B而不是太多B(A),因此auto(*)(A) -> B作为一个函数指针,采用 anA并返回 aBB(*)(A).


另一方面,写作auto main() -> int看起来很荒谬。

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


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

于 2018-08-30T19:11:07.060 回答