交换时增量迭代器 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 一个新的迭代器。
考虑代码:
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 一个新的迭代器。