尾随返回类型中的占位符类型的目的是什么?

时间:2019-01-29 20:11:47

标签: c++ language-lawyer

根据[dcl.fct]/2,以下摘录是合法的。 GCC and clang compile and execute the code

#include <iostream>
int i = -1;
auto f()->auto&& { return i; }
int main(){
    f() = 2;
    std::cout << i << '\n';
}

打印

2

但是在C ++中允许这样做的目的是什么?

在上面的示例中,仅用int&替换尾随返回类型就可以得到相同的结果。换句话说,我正在寻找一个示例,其中包含占位符类型的尾随返回类型将是有意义的。

2 个答案:

答案 0 :(得分:6)

您可以争论一致性:您可以将其他类型保留为尾随返回类型,为什么不使用占位符?

auto f() -> int&  { return i; }
auto f() -> auto& { return i; }

您可以对实用程序进行论证:lambdas的返回类型看起来像尾随返回类型,并且没有放置占位符类型的其他地方,因此无论如何您都必须将其用于lambda,因此也可能允许它用于功能?

auto f = []() -> int&  { return i; };
auto f = []() -> auto& { return i; };

您可以对代码格式进行争论。尾随返回类型允许以一致的方式声明在所有情况下始终有效的函数,因此只需对其进行排队:

auto g(auto x)     -> decltype(f(x)) { ... } // using trailing for parameter
auto Cls::member() -> type { ... }  // using trailing for scope (to find Cls::type)
auto h(auto x)     -> auto& { ... }  // using trailing for formatting

可能还有其他参数。简而言之,这很容易允许并且显然具有优点。

答案 1 :(得分:3)

您可以在auto原始提案的修订版N3582(2013-03-15) 1 中找到答案:

  跟踪返回类型

auto

     

该提议最初不允许 trailing-return-type 中的auto,但是从那时起,有人指出,只有通过这种方式才能指定lambda通过推导的引用返回类型:

[]()->auto& { return f(); }

(请记住,不仅功能而且lambda都可以具有 trailing-return-type

因此[dcl.spec.auto]/2

  

在任何情况下,auto 类型说明符可能与带有 trailing-return-type ([dcl.fct])的函数声明符一起出现这样的声明符是有效的。


1 注意:N3582在被实际采用之前已被N3638取代。