(由答案提示。)
给定 N3290,§7.1.6.2p4,其中列表项未编号,但为方便起见在此处编号:
decltype(e) 表示的类型定义如下:
- 如果 e 是不带括号的 id 表达式或不带括号的类成员访问 (5.2.5),则 decltype(e) 是由 e 命名的实体的类型。如果没有这样的实体,或者如果 e 命名了一组重载函数,则程序是非良构的;
- 否则,如果 e 是一个 xvalue,则 decltype(e) 是 T&&,其中 T 是 e 的类型;
- 否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;
- 否则,decltype(e) 是 e 的类型。
decltype(0 + 0) 指定的类型是什么?
第 1 项不适用,第 2 项可能,但如果不适用,则第 3 项不适用,结果为 4。那么,什么是 xvalue,0 + 0 是 xvalue 吗?
§3.10p1:
一个 xvalue(一个“eXpiring”值)也指一个对象,通常接近其生命周期的末尾(例如,它的资源可能会被移动)。xvalue 是某些涉及右值引用的表达式的结果 (8.3.2)。
我在 §8.3.2 中看不到任何有用的东西,但我知道“0 + 0”不涉及任何右值引用。文字 0 是一个纯右值,它是“一个不是 xvalue 的右值”(§3.10p1)。我相信“0 + 0”也是一个prvalue。如果这是真的,“decltype(0 + 0)”将是 int(不是 int&&)。
我在解释中是否遗漏了什么?这段代码格式正确吗?
decltype(0 + 0) x; // Not initialized.
该代码在 GCC 4.7.0 20110427 和 Clang 2.9(主干 126116)上编译。例如,如果 decltype 指定了一个 int&& 类型,那么它的格式就不是很好。