有关const decltype(x)&的问题

Lin*_*gxi 9 c++ templates metaprogramming decltype language-lawyer

请考虑以下代码:

int a = 1;
const int& b = a;
std::cout << std::is_same<const decltype(b)&, const int&>();
Run Code Online (Sandbox Code Playgroud)

它在clang 3.5上编译,而GCC 4.9给出以下错误:

error: 'const' qualifiers cannot be applied to 'const int&'

根据标准哪一个是正确的?我的猜测是GCC符合标准,就像你不能做到的那样int& const b = a;.

Ker*_* SB 3

我相信代码是有效的并且两种类型是相同的。

[dcl.ref]/1 说:

Cv 限定引用的格式不正确,除非通过使用 typedef -name (7.1.3, 14.1) 或decltype-specifier (7.1.6.2) 引入 cv 限定符,在这种情况下,cv 限定符将被忽略。

const由于您是通过decltype-specifier引入第一个类型,因此它会被忽略,并且您的第一个类型相当于decltype(b)&.

现在 [dcl.ref]/6 说:

如果typedef-name (7.1.3, 14.1) 或decltype-specifier (7.1.6.2) 表示一个类型,TR该类型是对 type 的引用T,则尝试创建类型“对cv 的 TR左值引用”会创建类型“左值”参考T“[...]

您的decltype-specifier表示类型“引用const int”,并且您正在尝试创建左值引用,因此最终会得到对 的左值引用const int