尾随返回类型函数语法中的 auto 关键字背后是否有意图?

dan*_*jar 5 c++ syntax function-declaration c++11 trailing-return-type

在 C++11 中,这两行是等价的。从我看来,第二种语法优点是返回类型在类范围内。因此,您可以直接使用类的嵌套类型和decltype非静态成员的表达式。此外,函数名称排列得很好。

int foo(int bar);
auto foo(int bar) -> int;
Run Code Online (Sandbox Code Playgroud)

auto这里使用的关键字,它也可以用来自动地得到局部变量的类型。但是,我没有看到这里的类比。在函数声明语法中,没有派生任何东西。箭头后面明确提到了返回类型。

就个人而言,我会说没有auto关键字语法会更清晰。这背后有什么意图吗?哪一个?

dyp*_*dyp 4

N1978的论文“Decltype (revision 5)”提出了Trailing-return-type的语法(现在众所周知)。这样做是为了简化定义函数模板,其返回类型取决于第 3 章中涉及其参数的表达式:

template <class T, class U> decltype((*(T*)0)+(*(U*)0)) add(T t, U u);
Run Code Online (Sandbox Code Playgroud)

该表达式(*(T*)0)是一种编写具有类型T且不需要T默认可构造的表达式的黑客方式。如果参数名称在范围内,则上述声明可以写为:

template <class T, class U> decltype(t+u) add(T t, U u);
Run Code Online (Sandbox Code Playgroud)

[Str02] 中讨论了将返回类型表达式移到参数列表之后的几种语法。如果返回类型表达式位于参数列表之前,则解析会变得困难,并且名称查找可能不太直观;参数名称在函数声明处的外部作用域中可能有其他用途。

我们建议重复使用auto关键字来表示返回类型位于参数列表之后。返回类型表达式前面是->符号,后面是参数列表和成员函数中潜在的 cv 限定符以及异常规范:

template <class T, class U> auto add(T t, U u) -> decltype(t + u);
Run Code Online (Sandbox Code Playgroud)

参考文献 [Str02] 是“Bjarne Stroustrup。“typeof”的草案提案。C++ 反射器消息 c++std-ext-5364,2002 年 10 月”。,但我不确定这是否是公开的。