在C++ 11函数中使用尾部返回类型的优点

wai*_*r92 7 c++ auto c++11 trailing-return-type

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

int foo1() {
    return 1;    
}

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

int main() {
    foo1();
    foo2();
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 11

在这个例子中,它们意味着完全相同的事情.

但是,使用尾随返回类型形式有一些优点(Phil Nash称之为"东端函数",因为返回类型位于东端).

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

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

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

    D ::C::foo() { ... }         // error, parsed as D::C::foo() { ... }
    
    auto ::C::foo() -> D { ... } // ok
    
    Run Code Online (Sandbox Code Playgroud)

有些情况下,trailing-return-type是强制性的,有些情况下它是有用的,并且有些情况下它会做同样的事情.除了简单的字符数之外,没有其他情况更糟糕的情况.

另外,在数学上我们已经习惯于将函数考虑在内A -> B而不是考虑函数B(A),因此auto(*)(A) -> B作为一个函数指针获取A并返回a B比该视图更接近B(*)(A).


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


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

  • 使用“auto”作为返回类型的一个美学原因是,对于声明来说,它可以很好地对齐函数和方法名称。我发现在阅读新代码时它在实践中有些用处。 (4认同)