【发布时间】:2012-10-04 13:56:01
【问题描述】:
当我今天阅读 C 标准时,它谈到了副作用
访问 volatile 对象、修改对象、修改文件或调用函数 做任何这些操作都是副作用
C++ 标准说
访问由 volatile glvalue (3.10) 指定的对象、修改对象、调用库 I/O 函数或调用执行任何这些操作的函数都是副作用
因此,由于两者都禁止在同一个标量对象上发生未排序的副作用,C 允许以下行为,但 C++ 使其成为未定义行为
int a = 0;
volatile int *pa = &a;
int b = *pa + *pa;
我是否正确阅读了规范?如果是这样,差异的原因是什么?
【问题讨论】:
-
我不认为存在差异。对于 C,对象的类型是读取对象的类型,而不是对象最初声明的类型。所以
*pa是一个左值,指定了一个volatile限定对象。 -
@JensGustedt 我假设它指的是“有效类型”的概念。对于具有声明类型的对象,它被定义为声明的类型。所以对于访问“*pa”,它的有效类型在这里是“int”,除非我遗漏了什么。
-
“当我今天阅读 C 标准时”
-
啊.. 修复 wiki 上关于可变波动率的 Comp-Sci 文章。因为仅仅阅读 C 标准会很奇怪,但是这样做来更新 wiki-comp-sci 文章更……正常? =P顺便说一句。好问题。
-
对对对,这里的有效类型是
int。有趣的是,如果您使用volatile int *pa = calloc(sizeof *pa, 1);,则有效类型将是 volatile。
标签: c++ c volatile side-effects