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

Sta*_*ght 14 c++ decltype c++11

根据这个答案,ref应该是一个int.

但由于某种原因,它int&在gcc和MSVC2015中decltype(b)进行了评估,而 正确评估为正确int.为什么这样?

int a = 1, b = 2;
decltype(a, b) ref; // ref is int&
decltype(b) var;    // var is int
Run Code Online (Sandbox Code Playgroud)

Rev*_*lot 17

a, b是一种表达.根据decltype表达式的规则,如果表达式的结果是左值,则类型将被推导为T&

7.1.6.2/4简单类型说明符[dcl.type.simple]
对于表达式e,由decltype(e)表示的类型定义如下:

  • 如果e是未表示的id-expression或未加密的类成员访问(5.2.5),则decltype(e)是e所命名的实体的类型.如果没有这样的实体,或者如果e命名了一组重载函数,那么该程序就会形成错误;
  • 否则,如果e是x值,则decltype(e)是T &&,其中T是e的类型;
  • 否则,如果e是左值,则decltype(e)是T&,其中T是e的类型;
  • 否则,decltype(e)是e的类型.

关于"名为实体的e类型e""类型"之间的区别的令人困惑的部分通过示例易于理解:

如果某个实体e被声明为int& e = x;,则稍后在表达式中e,类型为e is int,以及e is 命名的实体的类型int&.简而言之,类型的e drop参考限定符.

  • @ Peregring-lk实体名称有一个特定的规则.标准报价一秒钟. (2认同)

pep*_*ppe 8

由于同样的原因decltype((a)) ref将其声明ref为引用(int &而不是int).

decltype当规则处理表达式而不是实体时,规则是不同的.a, b表达式的值类别是左值,因此decltype(a, b)得到T&- > int &.

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