我尝试使用不同的选项在GCC 8.2下编译此C ++代码,但它总是成功,不会产生警告并输出true
:
int && a = 123;
decltype(auto) b = a;
std::cout << std::boolalpha << std::is_same<decltype(b), int&>::value;
同时,相同的代码将无法在Clang中编译,如果我对标准的理解是正确的,那就是符合标准的行为。
decltype
上的cppreference:
如果参数是未括号化的id表达式或未括号化的类成员访问表达式,则decltype会产生该表达式命名的实体的类型。
decltype(auto)
上的cppreference:
如果变量的声明类型为decltype(auto),则将关键字auto替换为其初始值设定项的表达式(或表达式列表),并使用decltype的规则推导实际类型。
因此,decltype(auto)
应该产生int&&
。并且由于a
是左值,因此它不应绑定到b
,从而导致编译错误。
那么GCC是否不符合标准?或者我缺少什么?
答案 0 :(得分:6)
您的推理是正确的。而且我认为我看到了GCC跳闸的地方。
decltype(auto)
的用语表示auto
被初始化器中的表达式代替。根据GCC,这将暗示您的代码不等于
decltype(a) b = a;
但是它等效于
decltype((a)) b = a;
但这是错误的。初始化程序 是“未加括号的id表达式” ,因此[dcl.type.simple]中用于未加括号的id表达式的规则应正常应用。 b
的类型需要推导为int&&
。
由于@Aconcagua能够挖掘出来,所以这是known GCC bug。