C++中引用list元素后执行pop操作是否属于未定义行为?
结论
这段C++代码是合法的,不存在未定义行为。
具体解释
- 引用
bar的所有访问操作都发生在pop_front()执行之前,此时foo的首元素还未被销毁,引用处于有效状态,访问操作完全合规。 std::list的pop_front()操作仅会销毁被弹出的首元素,同时使指向该元素的迭代器、指针、引用失效。引用失效本身不属于未定义行为,只有访问已经失效的引用才会触发未定义行为。- 你代码中的
bar是循环体内部的局部变量,pop_front()执行后本轮循环就结束了,bar的生命周期也随之终结,不存在后续访问失效引用的情况。
补充说明
你的实现思路是正确的,使用const引用避免拷贝的写法没有问题,对于占用空间更大的非平凡类型,这个优化的收益会更加明显。
如果担心后续维护时误在pop_front()之后访问bar引入问题,可以额外加一层作用域把引用和使用逻辑包裹起来,属于可选的防御性写法,示例如下:
#include <list> #include <utility> void myFunction(std::list<std::pair<int, int>> foo) { while (foo.size()) { { std::pair<int, int> const &bar = foo.front(); // work with bar } foo.pop_front(); } }
内容的提问来源于stack exchange,提问作者f222
相关产品推荐
相关产品推荐

