GCC的decltype(auto)是否不符合标准?

时间:2018-11-18 07:26:55

标签: c++ gcc clang auto decltype

我尝试使用不同的选项在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是否不符合标准?或者我缺少什么?

1 个答案:

答案 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