据我所知,像foo(++i, ++i)这样的C++代码会产生未定义的行为,因为每个“序列点”都会使i突变两次(顺便说一下,它的新术语是什么?)。但是,如果间接发生同样的事情怎么办?这是一个例子:

#include <iostream>

unsigned nextId = 0;
struct IdOwner {
  unsigned id;
  IdOwner() : id(nextId++) {} // mutates nextId
};

void test(IdOwner one, IdOwner two) {
  std::cout << one.id << " " << two.id << std::endl; // just observing
}

int main() {
  test(IdOwner{}, IdOwner{}); // indirectly mutates nextId twice per statement
}
调用test()会导致未定义的行为吗?对我来说,它打印的1 0很好(注意:未指定计算函数参数的顺序)。

最佳答案

未指定函数参数的评估顺序。在此通话中:

test(IdOwner{}, IdOwner{});
2个IdOwner对象可以按任何顺序求值,但是两个对象都将在调用test之前求值。因此程序可以打印0 11 0

关于c++ - 每个语句将相同值间接变异两次的结果是否未定义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63235260/

10-13 08:13