gpt4 book ai didi

c++ - 谁能解释当前 C++0x 标准草案的这一段?

转载 作者:IT老高 更新时间:2023-10-28 23:00:48 25 4
gpt4 key购买 nike

谁能解释 ISO N3242 的这句话? §3.2,第二点

An expression is potentially evaluated unless it is an unevaluated operand (Clause 5) or a subexpression thereof. A variable or non-overloaded function whose name appears as a potentially-evaluated expression is odr-used unless it is an object that satisfies the requirements for appearing in a constant expression (5.19) and the lvalue-to-rvalue conversion (4.1) is immediately applied. this is odr-used if it appears as a potentiallyevaluated expression (including as the result of the implicit transformation in the body of a non-static member function (9.3.1)).

ISO 标准 2003:说

An expression is potentially evaluated unless it appears where an integral constant expression is required (see 5.19), is the operand of the sizeof operator (5.3.3), or is the operand of the typeid operator and the expression does not designate an lvalue of polymorphic class type (5.2.8). An object or non-overloaded function is used if its name appears in a potentially-evaluated expression.

这些语句的实际区别是什么?

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

最佳答案

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

“odr-used”替换了“used”,我想他们认为单独的“used”可能与标准中“use”一词的其他用法有歧义。不过,在这两种情况下,它都定义了与 ODR 相关的“使用”的含义。

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

这是一个变化:

A variable or non-overloaded function whose name appears as a potentially-evaluated expression is odr-used unless it is an object that satisfies the requirements for appearing in a constant expression (5.19) and the lvalue-to-rvalue conversion (4.1) is immediately
applied.

对比

An object or non-overloaded function is used if its name appears in a potentially-evaluated
expression.

假设 a 是一个全局范围内的 static const int。那么在 C++03 中它就没有用在下面的语句中:

char x[a];

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

void foo(int); foo(a);

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

在 C++0x 中,a 在任何一种情况下都 not odr-used。它允许在常量表达式中,并且在函数调用中,立即应用左值-右值转换(因为 foo 是按值获取参数,而不是引用)。所以它符合 C++03 中不存在的“除非”。

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

关于c++ - 谁能解释当前 C++0x 标准草案的这一段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5565522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com