以下代码:
#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返回结果)。
问题:为什么结果会不同?
第二个问题:是否有工具可以检查这种错误?有任何clang警告吗?
我猜VC++中的
std::exchange
在评估其他操作数之前被调用,而在gcc中并非如此。 如果交换操作数pos
和std::exchange
,则在VC++和gcc中都将得到-1(或255)的结果。这可能与副作用相关,并且明确具有副作用的
std::exchange
函数被调用。幸运的是,我通过单元测试捕获了从VC++转换到gcc后的错误,起初有些慌乱,但最终将其简化为此简单的(不起作用的)示例。