据我所知,像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 1
或1 0
。关于c++ - 每个语句将相同值间接变异两次的结果是否未定义?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63235260/