int main(){
decltype(auto)&& a = 100;
}
以上代码,GCC和Clang中的错误。
int main(){
decltype(int)&& a = 100;
}
此代码更正。
在N4296,
在§8.3.2/ 6中
第7.1.6.2节中的如果typedef(7.1.3),类型模板参数(14.3.1)或decltype-specifier(7.1.6.2)表示类型TR 这是对类型T的引用,尝试创建类型“对cv TR的左值引用”会创建该类型 “左值引用T”,而尝试创建类型“rvue引用cv TR”会创建TR类型。
decltype-specifier
decltype说明符:
decltype(表达)
decltype(自动)
我认为§8.3.2/ 6 是措辞上的问题。
为什么不允许引用 decltype(auto)。 请告诉我相关标准的措辞。 抱歉英语不好。 谢谢。
答案 0 :(得分:3)
在第7.1.6.4节[dcl.spec.auto]
中如果占位符是decltype(auto)类型说明符,则声明 函数的变量或返回类型的类型应为 单独占位符。推导出的变量或返回类型的类型是 按照7.1.6.2中的描述确定,就像初始化程序一样 decltype的操作数。
所以这是允许的:
decltype(auto) a = 100;
但不是这样:
decltype(auto)& a = 100;
或者这个:
decltype(auto)&& a = 100;
这是有道理的,因为decltype(auto)
背后的一个想法是在类型推导期间保留引用(即使用decltype
类型推导,而不是模板/自动类型推导)
该标准为我们举例说明了decltype(auto)
:
int i;
int&& f();
auto x3a = i; // decltype(x3a) is int
decltype(auto) x3d = i; // decltype(x3d) is int
auto x4a = (i); // decltype(x4a) is int
decltype(auto) x4d = (i); // decltype(x4d) is int&
auto x5a = f(); // decltype(x5a) is int
decltype(auto) x5d = f(); // decltype(x5d) is int&&
auto x6a = { 1, 2 }; // decltype(x6a) is std::initializer_list<int>
decltype(auto) x6d = { 1, 2 }; // error, { 1, 2 } is not an expression
auto *x7a = &i; // decltype(x7a) is int*
decltype(auto)*x7d = &i; // error, declared type is not plain decltype(auto)