(受一个答案的启发。)
根据N3290,§7.1.6.2p4,其中列表项未编号,但在此处为方便起见进行了编号:
由decltype(e)表示的类型定义如下:
- 如果e是未括在括号中的id表达式或未括在括号中的类成员访问(5.2.5),则decltype(e)是由e命名的实体的类型。如果没有这样的实体,或者e命名一组重载函数,则程序是非法的;
- 否则,如果e是xvalue,则decltype(e)是T&&,其中T是e的类型;
- 否则,如果e是lvalue,则decltype(e)是T&,其中T是e的类型;
- 否则,decltype(e)是e的类型。
decltype(0 + 0)指定的类型是什么?
第1项不适用,第2项可能适用,但如果不适用,则第3项不适用,第4项将是结果。那么,什么是xvalue,0 + 0是xvalue吗?
§3.10p1:
xvalue(“eXpiring”值)也是引用对象,通常接近其生命周期的末尾(以便移动其资源,例如)。xvalue是涉及rvalue引用(8.3.2)的某些类型的表达式的结果。
我在§8.3.2中没有发现任何对此有帮助的内容,但我知道“0 + 0”不涉及任何rvalue引用。字面值0是一个prvalue,“不是xvalue的rvalue”(§3.10p1)。我相信“0 + 0”也是一个prvalue。如果是这样,“decltype(0 + 0)”将是int(而不是int&&)。
我是否在我的解释中错过了什么?这个代码是否有效?
decltype(0 + 0) x; // Not initialized.
该代码可在GCC 4.7.0 20110427和Clang 2.9(trunk 126116)上编译。如果decltype指定了int&&类型,则其将不符合格式要求。
decltype(0 + 0)
应该是int
。 - CB Bailey0 + 0
的意图是一个 prvalue。lvalue = identity 而且不可移动。xvalue = identity 而且可移动。prvalue = 没有 identity 而且可移动。xvalue 是指引用对象的表达式(在 C++ 中,对象具有唯一的身份,由地址、类型和生命周期确定),并且该对象可以被移动(被视为即将过期)。当然,这是我的愚蠢解释,不能在规范中找到。 - Johannes Schaub - litbint a; (int&&)a;
强制转换产生的xvalue指的是一个对象。另一个例子(int&&)2;
,被引用绑定的临时变量具有身份。它的生命周期将在完整表达式结束时结束。非类、非数组的prvalue没有身份。例如2
,它与代码中出现的另一个2
或1+1
没有区别。 - Johannes Schaub - litb