在 C++ 中,"access" 在严格的别名规则中意味着什么?

In C++, What does "access" mean in the strict aliasing rule?

3.10/10 说:

If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined:

但是,术语 "access" 未在任何地方定义。在这种情况下,它是指 read,还是 read or modify


在C标准中明确定义为读取或修改。然而在C++11中,它似乎在不同的时间使用不同的含义,例如:

1.9/8:

Access to volatile objects are evaluated strictly according to the rules of the abstract machine.

显然这意味着要读取或修改,但是在许多其他地方,例如 1.10/24:

  • access or modify a volatile object, or

它被用作好像它只意味着

我不自称是语言律师。然而...

我会将短语 "access the stored value of an object" 解释为“读取 对象的存储值”。

鉴于上一段讨论修改对象,这种解释更有意义。

9 If an expression can be used to modify the object to which it refers, the expression is called modifiable. A program that attempts to modify an object through a nonmodifiable lvalue or rvalue expression is ill-formed.

必须是读和写的意思,否则这条规则意义不大。考虑来自 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html 的示例:

float *P;
void zero_array() {
   int i;
   for (i = 0; i < 10000; ++i)
       P[i] = 0.0f;
}

仅当编译器可以假定 P[i] 的 none 别名 P 时,才能将上面的示例代码优化为 memset。但是考虑一个世界,其中只有 read 来自不允许的泛左值是 UB,那么即使 P[i] 别名 P 某些 i - 例如,如果有人做了 P = (float *) &P;,因为 P 的所有 读取 都是完全合法的 - 他们都使用左值表达式 P


编辑CWG issue 1531 说的很对。该问题已于 2013 年 4 月移至 DR(缺陷报告)状态,但无论出于何种原因,该解决方案均未应用于工作文件。