有关const decltype(x)&的问题

时间:2015-04-09 14:10:01

标签: c++ templates metaprogramming language-lawyer decltype

请考虑以下代码:

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;一样。

1 个答案:

答案 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;左值引用 cv TR&#34;创建T&#34;的类型&#34;左值引用; [...]

您的 decltype-specifier 表示类型&#34;对const int&#34;的引用,并且您正在尝试创建左值引用,因此最终得到左值参考const int