c ++ 11 decltype返回引用类型

use*_*782 4 c++ decltype c++11

我有点困惑为什么decltype逗号运算符在某些情况下返回引用类型.

例如,在此代码中:

int i = 101;
decltype(1, i) var = i;
var = 20;
printf("%d\n", i); // will print 20
Run Code Online (Sandbox Code Playgroud)

这里,var是int而不是int,但如果我用第二行替换:

decltype(i) var = i;
Run Code Online (Sandbox Code Playgroud)

它将返回int!

任何人都可以解释一下吗?

eca*_*mur 7

decltype是一个特殊情况下的未表示的id-expression来给出实体的类型,没有参考资格[dcl.type.simple]:

4 - 表示的类型decltype(e)定义如下:
- 如果e是未加密码的id-expression或未加密的类成员访问(5.2.5),decltype(e)则是名为的实体的类型e.[...]
- 否则,如果e是左值,decltype(e)则是T&,T类型e; [...]

通过提供逗号表达式,您将禁用此特殊情况,如括号:

decltype(i)    // int
decltype((i))  // int&
decltype(1, i) // int&
Run Code Online (Sandbox Code Playgroud)

(i)并且1, i是左值表达式,因此它们decltype是引用类型.