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参考限定符.
由于同样的原因decltype((a)) ref将其声明ref为引用(int &而不是int).
decltype当规则处理表达式而不是实体时,规则是不同的.a, b表达式的值类别是左值,因此decltype(a, b)得到T&- > int &.
另见http://en.cppreference.com/w/cpp/language/decltype
| 归档时间: |
|
| 查看次数: |
629 次 |
| 最近记录: |