请考虑以下代码:
int a = 1;
const int& b = a;
std::cout << std::is_same<const decltype(b)&, const int&>();
它在clang 3.5上编译,而GCC 4.9则出现以下错误:
error: 'const' qualifiers cannot be applied to 'const int&'
根据标准,哪一个是正确的?我的猜测是GCC符合标准,就像你不能做int& const b = a;
一样。
答案 0 :(得分:3)
我相信代码是有效的,两种类型是相同的。
[dcl.ref] / 1说:
除非通过使用 typedef-name (7.1.3,14.1)或 decltype-specifier >引入cv限定符,否则Cv限定引用的格式不正确(7.1.6.2),在这种情况下,cv限定符被忽略。
由于您是通过 decltype-specifier 引入第一个const
,因此会忽略它,并且您的第一个类型等同于decltype(b)&
。
现在[dcl.ref] / 6说:
如果 typedef-name (7.1.3,14.1)或 decltype-specifier (7.1.6.2)表示类型
TR
是引用类型T
,尝试创建类型&#34;左值引用 cvTR
&#34;创建T
&#34;的类型&#34;左值引用; [...]
您的 decltype-specifier 表示类型&#34;对const int
&#34;的引用,并且您正在尝试创建左值引用,因此最终得到左值参考const int
。