任何人都可以从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中,则使用非重载函数 潜在地评估 表达
这些陈述的实际差异是什么?
任何人都可以借助示例/程序来解释这个吗?
答案 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中则没有。我没有检查标准中的其他内容是否使用了“可能已评估”,这可能会受到此更改的影响。如果它只是在这里提到那么它的那一部分不是一个改变,只是异常已从“潜在评估”转移到“使用”。