引用列表元素然后弹出它,它是未定义的行为吗?

Reference list element then popping it, is it undefined behaviour?

我有这段代码,我想知道它是否有效或是否会导致未定义的行为:

#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();
    }
}

我正在使用参考以避免重复现有的对。

一方面,我认为这可能是未定义的行为,因为我正在删除引用的元素,但另一方面,删除后我没有访问引用。

有效吗?

只要您不尝试使用 bar 引用 foo.pop_front(); 语句之后,您就不会得到未定义的行为,因为在从容器中移除所引用的元素之前,该引用一直有效。

在你的例子中,pop 似乎是引用范围内的最后一条语句(在 while 循环的每次迭代中都会有一个新语句 created/formed),因此看起来不是问题。

对我来说有效。
std::list::pop_front() 递减 size
std::list::empty() returns 当 beginend 迭代器比较相等时为真。当begin到end的距离为0时size为0.
据我所知,这都是明确定义的行为。