考虑代码:
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)
的求值顺序在c++17之后未指定,因此第二个操作可能在第一个操作之前执行,然后交换两个等价值。
在所附的链接中,你可以看到
f(++i, ++i); // undefined behavior until C++17, unspecified after C++17
但在第二段代码中,您有不同的参数,std::next()
返回一个新的迭代器。