【发布时间】:2023-03-05 05:06:01
【问题描述】:
我读过这个:
- Undefined behavior and sequence points
- Undefined behavior and sequence points reloaded
- Sequence Points and Method Chaining
- GCC bug? Chaining methods, broken sequence point
...但我仍然不确定这应该如何表现:
int should_be_zero
= stream.seek(4).read_integer()
- stream.seek(4).read_integer();
Stream::seek() 返回*this 和seek/read_integer() 分别在某些FILE* 上调用fseek/fread。
这应该像这样返回 0:
stream.seek(4)-
stream.read_integer()(在位置 4,返回X,流位置提前到 8) stream.seek(4)-
stream.read_integer()(在位置 4,返回Y == X) X - Y == 0
这对我在 gcc、MinGW 和 MinGW-w64 上运行良好。但是当我决定扩展对 MSVC 的编译器支持时,我发现这不再起作用并返回垃圾值。下面是 MSVC 上实际发生的情况:
stream.seek(4)-
stream.seek(4)(再次) -
stream.read_integer()(在位置 4,返回X,流位置提前到 8) -
stream.read_integer()(在第 8 位,返回Y != X) X - Y != 0
这样的执行顺序是否明确定义?如果没有,我该如何保护自己,以后不会像这样在脚上开枪?
(用括号括起来似乎没有任何作用。)
【问题讨论】:
-
操作数的计算可能是交错的。不要做有副作用的无序的事情来保护自己。 (括号对排序没有影响。)
-
Stream::seek() 返回 *this -- 函数的实际原型是什么?
标签: c++ c++11 method-chaining sequence-points