【发布时间】:2021-03-04 13:48:31
【问题描述】:
以下代码:
#include <utility>
int main()
{
auto pos = 0;
auto rel = pos - std::exchange(pos, pos + 1);
return rel; // g++: 0, VC++: 1
}
如果您使用 VC++ 编译器尝试 rextester 上的代码,则结果为 1,而在 godbolt 上使用 gcc,结果为 0(使用 rextester 的 gcc 显然不会返回结果)。
问题:为什么结果不同?
还有第二个问题:有没有工具可以检查这个错误?任何叮当警告?
我的猜测是,VC++ 中的std::exchange 在计算其他操作数之前被调用,而在 gcc 中却不是这样。如果您交换操作数 pos 和 std::exchange,VC++ 和 gcc 的结果都是 -1(或 255)。
这可能与副作用有关 - 调用 std::exchange 显然有副作用。
幸运的是,在从 VC++ 转换到 gcc 后,我通过单元测试发现了这个错误 - 起初有点慌张,并将其归结为这个简单(不)工作的示例。
【问题讨论】:
-
对我来说听起来像是未定义的行为。不要求从左到右评估它们。
-
@tadman 你的评论到底有没有帮助?
标签: c++ gcc visual-c++