为什么decltype(a,b)被评估为参考?

时间:2016-06-26 17:59:30

标签: c++ c++11 decltype

根据此answerref应该是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

2 个答案:

答案 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 eint 命名的实体的类型是e。简而言之,类型int& 会删除引用限定符。

答案 1 :(得分:8)

出于同样的原因decltype((a)) refref声明为int &,而不是int)。

decltype规则在处理表达式而非实体时是不同的。 a, b表达式的值类别是左值,因此decltype(a, b)会产生T& - > int &

另见http://en.cppreference.com/w/cpp/language/decltype