考虑代码:
list<int> a{ 4,3,1,2 };
auto i = a.begin();
swap(*i, *(++i));
为什么交换什么都不做?虽然以下按预期工作?
list<int> a{ 4,3,1,2 };
auto i = a.begin();
swap(*i, *(next(i)));
最佳答案
在第一段代码中,*i
和 *(++i)
这两个操作的求值顺序 unspecified after c++17 ,因此第二个可能在第一个之前执行,然后交换交换两个等价的值。
在附件中,你可以看到
f(++i, ++i); // undefined behavior until C++17, unspecified after C++17
但是在第二个代码中你有不同的参数并且 std::next()
返回一个新的迭代器。
关于c++ - 交换时增量迭代器 std::next,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63453741/