问题描述
考虑代码:
list<int> a{ 4,3,1,2 };
auto i = a.begin();
swap(*i,*(++i));
为什么交换不执行任何操作?尽管以下各项按预期工作?
list<int> a{ 4,*(next(i)));
解决方法
在第一个代码中,两个操作*i
和*(++i)
unspecified after c++17的求值顺序,因此第二个操作可以在第一个操作之前执行,然后交换交换两个等效项值。
在附件链接中,您可以看到
f(++i,++i); // undefined behavior until C++17,unspecified after C++17
但是在第二个代码中,您有不同的参数,std::next()
返回了一个新的迭代器。