论文“Decltype (revision 5)”,N1978提出了trailing-return-type的语法(现在已知)。这样做是为了简化定义函数模板,其返回类型取决于第 3 章中涉及其参数的表达式:
template <class T, class U> decltype((*(T*)0)+(*(U*)0)) add(T t, U u);
该表达式(*(T*)0)
是编写具有该类型T
且不需要T
默认可构造的表达式的一种骇人听闻的方式。如果参数名称在范围内,则上述声明可以写成:
template <class T, class U> decltype(t+u) add(T t, U u);
在 [Str02] 中讨论了将返回类型表达式移到参数列表之后的几种语法。如果返回类型表达式出现在参数列表之前,则解析变得困难并且名称查找可能不太直观;参数名称可能在函数声明位置的外部范围内有其他用途。
我们建议重用auto
关键字来表示返回类型在参数列表之后。返回类型表达式以->
符号开头,并在成员函数和异常规范中的参数列表和潜在的 cv 限定符之后:
template <class T, class U> auto add(T t, U u) -> decltype(t + u);
参考文献 [Str02] 是“Bjarne Stroustrup。“typeof”提案草案。C++ 反射器消息 c++std-ext-5364,2002 年 10 月。” ,但我不确定这是否公开。