c++ - 每个语句将相同值间接变异两次的结果是否未定义?

标签 c++ c++11 c++14 undefined-behavior sequence-points

据我所知,像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/

相关文章:

c++ - 如何创建一个四维指针数组?

c++ - 整数序列作为非类型模板参数

c++ - 链接时如何删除拷贝?

c++ - 如何检查 T 是否为聚合类型?

c++ - 根据另一个数组的顺序对一个数组进行排序

c++ - 模板并拆分为 .h/.cpp 文件

c++ - 长时间 sleep 时退出

c++ - 根据另一个 vector 中的元素过滤/复制一个 vector

c++14 - 如何迭代参数包

c++ - auto 在 C++ 中做的事情是否与在 C 中完全不同?