【发布时间】:2015-03-12 03:20:36
【问题描述】:
3.10/10 说:
如果程序尝试通过以下类型之一以外的左值来访问对象的存储值,则行为未定义:
但是,“访问”一词在任何地方都没有定义。在这种情况下,它是指读取,还是读取或修改?
在 C 标准中,它被明确定义为读取或修改。但是在 C++11 中,它似乎在不同的时间有不同的含义,例如:
1.9/8:
对易失性对象的访问严格按照抽象机的规则进行评估。
显然这是为了读取或修改,但是在许多其他地方,例如 1.10/24:
- 访问或修改易失性对象,或
它的使用好像它只是意味着读取。
【问题讨论】:
-
您可以将标题缩短为:“在 C++ 中,‘访问’是什么意思?”这是一个很好的问题。 (当然,对于严格的别名规则,其意图肯定是“读取或修改”,类似于C。)
-
@Nemo 同意,尽管我对这个特殊案例最感兴趣。这可能是一个单独的问题。
-
好吧,不管他们在本节中的意图如何,他们肯定没有说清楚,所以我想说你肯定在规范中发现了一个错误。
-
标准在这类事情上是出了名的糟糕。即使是像我这样狂热的语言律师也会避免像瘟疫这样的问题。你靠自己;)
-
@LightnessRacesinOrbit 呵呵。严格的混叠问题非常可怕,可以在没有这种模糊性的情况下解开。我一直认为它应该和 C 中的一样;但我一直在阅读有关严格别名的其他一些答案(特别是与结合新位置有关),它们都默认依赖 access 仅表示 read,所以我是希望在进一步评论/发布严格别名之前清除这个问题
标签: c++ language-lawyer strict-aliasing