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

问题描述 投票:3回答:1

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

int foo1() {
    return 1;    
}

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

int main() {
    foo1();
    foo2();
}
c++ c++11 auto trailing-return-type
1个回答
9
投票

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

但是,使用尾随返回类型形式有一些优点(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

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

另外,在数学上我们习惯于将功能视为A -> B而不是B(A),所以auto(*)(A) -> B作为函数指针采用A并返回BB(*)(A)更接近该视图。


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


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

© www.soinside.com 2019 - 2024. All rights reserved.