根据此answer,ref
应该是int
。
但出于某种原因,它在gcc和MSVC2015中评估为int&
,而decltype(b)
被正确评估为int
。为什么这样?
int a = 1, b = 2;
decltype(a, b) ref; // ref is int&
decltype(b) var; // var is int
答案 0 :(得分:17)
a, b
是一个表达式。根据{{1}}表达式规则,如果表达式的结果是左值,则类型将推导为decltype
7.1.6.2/4简单类型说明符[dcl.type.simple]
对于表达式e,由decltype(e)表示的类型定义如下:
- 如果e是未表示的id-expression或未表示的 class member access(5.2.5),decltype(e)是实体的类型 以e命名。如果没有这样的实体,或者e命名一组 重载功能,程序形成不良;
- 否则,如果e是x值,则decltype(e)是T&&,其中T是e的类型;
- 否则,如果e是左值,则decltype(e)是T&,其中T是类型 e;
- 否则,decltype(e)是e的类型。
关于{em>"由T&
" 和" e
类型命名的实体类型之间差异的令人困惑的部分" 很容易理解,例如:
如果某个实体e
被声明为e
,那么稍后,在表达式 int& e = x;
中,类型为e
是e
,int
命名的实体的类型是e
。简而言之,类型int&
会删除引用限定符。
答案 1 :(得分:8)
出于同样的原因decltype((a)) ref
将ref
声明为int &
,而不是int
)。
decltype
规则在处理表达式而非实体时是不同的。 a, b
表达式的值类别是左值,因此decltype(a, b)
会产生T&
- > int &
。