什么是 C++ 中的内存位置修改?

问题描述

C++ standard 说:

6.9.2.1。如果其中一个修改内存位置(6.6.1)而另一个读取或修改相同的内存位置,则两个表达式计算会发生冲突。

但是什么算作“修改内存位置”?标准在这句话之前只提到了12次“修改”,没有一个是相关的。

例如

int x = 0;
do_something(&x);
x = 0; // (*)

假设 x 之后 do_something 仍然为零,行 (*) 是否修改 x

解决方法

我能找到的最相关的规则是(引自最新标准草案)

访问 [defns.access]

⟨执行时动作⟩读取或修改对象的值

[注1:只能访问标量类型的对象。 标量对象的读取在 [conv.lval] 中描述,而标量对象的修改在 [expr.ass]、[expr.post.incr] 和 [expr.pre.incr] 中描述。 尝试读取或修改类类型的对象通常会调用构造函数或赋值运算符;这种调用本身并不构成访问,尽管它们可能涉及对标量子对象的访问。 — 尾注]


[介绍对象]

C++ 程序中的构造创建、销毁、引用、访问和操作对象。 ... 一个对象在其构建期间 ([class.cdtor])、整个生命周期和销毁期间 ([class.cdtor]) 占用一个存储区域。


[intro.memory]

一个内存位置要么是一个非位域的标量类型的对象,要么是宽度不为零的相邻位域的最大序列。

[注 2:语言的各种特性,例如引用和虚拟函数,可能涉及程序无法访问但由实现管理的额外内存位置。 — 尾注]


[basic.types.general]

算术类型([basic.fundamental])、枚举类型、指针类型、成员指针类型([basic.compound])、std :: nullptr_t和这些类型的cv限定版本统称为称为标量类型。 ...

我不会引用突出显示规则中提到的整个部分,但它们描述了前后递增/递减和(复合)赋值。

标准似乎也偶尔使用术语“写入”,我认为它与“修改”同义。