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

时间:2018-08-30 19:00:55

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

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

int foo1() {
    return 1;    
}

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

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

1 个答案:

答案 0 :(得分:9)

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

但是,始终使用尾随返回类型有一些好处(Phil Nash称这些new JVM standard option ,因为返回类型位于最东端)。

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

    source
  2. 名称查找。在尾随返回类型中,名称查找包括成员函数定义的类范围。这意味着如果要返回嵌套的类,则不必重新输入类:

    target
  3. 同样,用于定义成员函数,在这些成员函数中,必须出于某种原因将类名明确地包含在全局名称空间中,并且返回类型为类:

    template <typename T>
    auto print(T const& t) -> decltype(std::cout << t) { return std::cout << t; }
    

在某些情况下,尾随返回类型是强制性的,在某些情况下它是有帮助的,并且在某些情况下它执行相同的操作。在大多数情况下,除了字符计数外,没有其他原因会导致这种情况恶化。

此外,从数学上讲,我们习惯于将函数视为Type C::foo() { ... } // error: don't know what Type is C::Type C::foo() { ... } // ok auto C::foo() -> Type { ... } // ok 而不是D ::C::foo() { ... } // error, parsed as D::C::foo() { ... } auto ::C::foo() -> D { ... } // ok ,因此A -> B作为函数指针使用B(A)并返回auto(*)(A) -> BA更接近该视图。


另一方面,写B看起来很荒谬。


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