任何人都可以解释当前C ++ 0x标准草案的这一段吗?

时间:2011-04-06 11:23:44

标签: c++ c++11

任何人都可以从ISO N3242§3.2,第二点

解释这个陈述
  

表达式可能会被评估,除非它是未评估的操作数         (第5条)或其子表达。变量或非重载   名称显示为潜在评估表达式的函数是   odr-used,除非它是一个满足出现在a。中的要求的对象   不变         表达式(5.19)和左值到右值的转换(4.1)是   立即         应用。如果它看起来像一个潜在的评估,这是有用的   表达         (包括作为体内隐含变换的结果   一个         非静态成员函数(9.3.1))。

ISO标准2003:说

  

表达式可能会被评估,除非它出现在哪里   积分          需要常量表达式(见5.19),是操作数   的sizeof          operator(5.3.3),或者是typeid运算符的操作数和   表达          不指定多态类类型的左值(5.2.8)。一个   对象或          如果其名称出现在a中,则使用非重载函数   潜在地评估          表达

这些陈述的实际差异是什么?

任何人都可以借助示例/程序来解释这个吗?

1 个答案:

答案 0 :(得分:11)

“未评估的操作数”替换“是sizeof运算符的操作数(5.3.3),或者是typeid运算符的操作数,表达式不指定多态类类型的左值(5.2.8)”。它具有相同的基本用途,但不会尝试列出操作数未评估的运算符的C ++ 0x标准中的所有情况。例如,decltype是一个新的。

“odr-used”取代“used”,我认为他们认为单独使用“used”可能与标准中“use”一词的其他用法含糊不清。但是,在这两种情况下,它都定义了与ODR相关的“使用”感。

所以这些并没有真正改变,只是为C ++ 0x更新了重写措辞。

这是一个改变:

  

变量或非重载函数   其名称显示为   潜在评估的表达是   odr-used,除非它是一个对象   满足要求   出现在一个恒定的表达中   (5.19)和左值到右值   转换(4.1)立即生效   应用

VS

  

对象或非超载   如果出现名称,则使用该函数   在可能评估的中   表达

假设a在全球范围内是static const int。然后在C ++ 03中,它不会在以下语句中使用:

char x[a];

因为上下文需要一个常量表达式。但是,它用于以下内容:

void foo(int); foo(a);

因为上下文不需要常量表达式。

在C ++ 0x中,a在任何一种情况下都不是 odr-used。它被允许在一个常量表达式中,并且在函数调用中,立即应用lvalue-rvalue转换(因为foo通过值获取其参数,而不是引用)。所以它有资格获得C ++ 03中没有的“除非”。

“潜在评估”的定义也存在差异。在第一个示例中,char x[a]a可能在C ++ 03中进行评估,但在C ++ 0x中则没有。我没有检查标准中的其他内容是否使用了“可能已评估”,这可能会受到此更改的影响。如果它只是在这里提到那么它的那一部分不是一个改变,只是异常已从“潜在评估”转移到“使用”。