交换时增量迭代器 std::next

Incremented iterator std::next when swapping

考虑代码:

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两个操作的计算顺序,因此第二个可能先于第一个执行,然后交换交换两个等价的值。

在附件link中,你可以看到

f(++i, ++i); // undefined behavior until C++17, unspecified after C++17

但是在第二个代码中你有不同的参数和 std::next() returns 一个新的迭代器。