(由an answer提示。)什么是decltype(0 + 0)?
鉴于N3290,§7.1.6.2p4,这里的列表项是无编号,但编号在这里为我们的方便:
通过decltype表示的类型(E )被定义为如下:
- 如果e是一个括号的ID-表达或加括号的类的成员访问(5.2.5),decltype(e)是通过e命名实体的类型。如果没有这样的实体,或者如果e名称是一组重载函数,则该程序是不合格的;如果e是x值,则decltype(e)是T & &,其中T是e的类型;否则,如果e是左值,则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:
的x值(一个“到期”值)也指一个对象,通常接近其寿命的末尾(使得其资源可以被移动,例如)。 xvalue是涉及右值引用的某些表达式的结果(8.3.2)。
我没有在§8.3.2中看到任何有用的东西,但我知道“0 + 0”不涉及任何右值引用。文字0是一个prvalue,它是“不是一个xvalue的右值”(§3.10p1)。我相信“0 + 0”也是一个价值。如果是这样,“decltype(0 + 0)”将是int(不是int & &)。
我错过了我的解释?这段代码是否合格?
decltype(0 + 0) x; // Not initialized.
代码在GCC 4.7.0 20110427和Clang 2.9(中继线126116)上编译。例如,如果decltype指定了一个int & &类型,那么它将不会完好。
我没有看到你的推理有什么问题。我相信'decltype(0 + 0)'也应该是'int'。 – 2011-05-08 00:36:00
FWIW,肯定的一个好的答案是扩展xvalue的定义并展示它的可能和不可能。 (我会发现*非常有用)。我需要看看如何重新说明,关注“什么是xvalue?”同时仍然考虑这个“0 + 0”的具体情况。 – 2011-05-08 00:43:00
虽然最新的草案确实为很多表达式指定了_value category_,包括后缀增量和3.10中的一个注释,表明第5条应该显示每个内置操作符的值的类别,但似乎没有提到草案任何二元运算符的值类别从5.6到5.15,除非我的搜索能力让我失败。 – 2011-05-08 00:58:33