有关 const decltype(x)& 的问题

Issues concerning const decltype(x)&

本文关键字:问题 const decltype 有关      更新时间:2023-10-16

请考虑以下代码:

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

我相信

代码是有效的,两种类型是相同的。

[dcl.ref]/1 说:

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

由于您是通过 decltype 说明符引入第一个const,因此它将被忽略,并且您的第一个类型等效于 decltype(b)&

现在 [dcl.ref]/6 说:

如果 typedef-name (7.1.3, 14.1( 或 decltype-specifier (7.1.6.2( 表示对类型T的引用的类型TR,则尝试创建类型"对 cv TR 的左值引用"将创建类型"对 T 的左值引用" [...]

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