trailing-return-type中占位符类型的用途是什么?

Wal*_*ldB 6 c++ language-lawyer

根据[dcl.fct]/2,下面的代码段是合法的.GCC和clang编译并执行代码,

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

印花

2
Run Code Online (Sandbox Code Playgroud)

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

在上面的示例中,只需将trailing-return-type替换为,就可以获得相同的结果int&.换句话说,我正在寻找一个示例,其中包含占位符类型的trailing-return-type将是有意义的.

Bar*_*rry 6

您可以对一致性进行论证:您可以将其他类型作为尾随返回类型,为什么不是占位符?

auto f() -> int&  { return i; }
auto f() -> auto& { return i; }
Run Code Online (Sandbox Code Playgroud)

你可以对实用程序进行一个论证:lambdas的返回类型看起来像一个尾随的返回类型,并且没有其他地方可以放置占位符类型,所以你必须允许它为lambdas,所以不妨允许它用于函数?

auto f = []() -> int&  { return i; };
auto f = []() -> auto& { return i; };
Run Code Online (Sandbox Code Playgroud)

您可以对代码格式进行争论.尾随返回类型允许一致的方式来声明始终适用于所有情况的函数,因此只需将其排列:

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
Run Code Online (Sandbox Code Playgroud)

可能还有其他争论.但简而言之,它很容易被允许并且显然具有优点.


rus*_*tyx 3

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

auto尾随返回类型

该提案最初不允许在Trailing-return-type中使用 auto ,但从那时起,有人指出将其放在那里是指定 lambda 通过推导的引用类型返回的唯一方法:

[]()->auto& { return f(); }
Run Code Online (Sandbox Code Playgroud)

(请记住,不仅函数而且 lambda 都可以有Trailing-return-type

因此[dcl.spec.auto]/2

类型auto 说明符可以与具有尾随返回类型([dcl.fct])的函数声明符一起出现在此类声明符有效的任何上下文中。


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