关于 const decltype(x)& 的问题
Issues concerning const decltype(x)&
考虑以下代码:
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-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name (7.1.3, 14.1) or decltype-specifier (7.1.6.2), in which case the cv-qualifiers are ignored.
由于您是通过 decltype-specifier 引入第一个 const
,它会被忽略,您的第一个类型等同于 decltype(b)&
。
现在 [dcl.ref]/6 说:
If a typedef-name (7.1.3, 14.1) or a decltype-specifier (7.1.6.2) denotes a type TR
that is a reference to a type T
, an attempt to create the type "lvalue reference to cv TR
" creates the type "lvalue reference to T
" [...]
你的 decltype-specifier 表示类型 "reference to const int
",你试图创建一个左值引用,所以你最终得到一个对 [=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-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name (7.1.3, 14.1) or decltype-specifier (7.1.6.2), in which case the cv-qualifiers are ignored.
由于您是通过 decltype-specifier 引入第一个 const
,它会被忽略,您的第一个类型等同于 decltype(b)&
。
现在 [dcl.ref]/6 说:
If a typedef-name (7.1.3, 14.1) or a decltype-specifier (7.1.6.2) denotes a type
TR
that is a reference to a typeT
, an attempt to create the type "lvalue reference to cvTR
" creates the type "lvalue reference toT
" [...]
你的 decltype-specifier 表示类型 "reference to const int
",你试图创建一个左值引用,所以你最终得到一个对 [=16 的左值引用=].