交换时递增的迭代器std :: next

问题描述

考虑代码:

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()返回了一个新的迭代器。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...