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

1Us*_*ser 13 c++ c++11

任何人都可以从ISON3242§3.2第二点 解释这一说法

除非是未评估的操作数(第5条)或其子表达式,否则可能会对表达式进行求值.名称显示为潜在评估表达式的变量或非重载函数是odr使用的,除非它是满足出现在常量表达式(5.19)中的要求的对象,并且左值到右值转换(4.1)是立即申请.如果它看起来像一个潜在评估的表达式(包括作为非静态成员函数(9.3.1)的主体中的隐式转换的结果),则使用odr.

ISO标准2003:说

表达式可能被评估,除非它出现在需要整数常量表达式的地方(见5.19),是sizeof运算符的操作数(5.3.3),或者是typeid运算符的操作数,并且表达式没有指定左值多态类型(5.2.8).如果对象或非重载函数的名称出现在可能已评估的表达式中,则使用该函数.

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

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

Ste*_*sop 11

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

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

所以这些并不是真正的改变,只是为C++ 0x更新了重新措辞.

这是一个变化:

名称显示为潜在评估表达式的变量或非重载函数是odr使用的,除非它是满足出现在常量表达式(5.19)中的要求的对象,并且左值到右值转换(4.1)是立即
申请.

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

假设astatic const int全球范围的.然后在C++ 03中,它不会在以下语句中使用:

char x[a];
Run Code Online (Sandbox Code Playgroud)

因为上下文需要一个常量表达式.但是,它用于以下方面:

void foo(int); foo(a);
Run Code Online (Sandbox Code Playgroud)

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

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

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