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

f22*_*222 3 c++ undefined-behavior language-lawyer

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

#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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用引用来避免重复已经存在的对。

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

有效吗?

Adr*_*ica 6

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

在您的情况下,弹出似乎是引用范围中的最后一个语句(将在循环的每次迭代中创建/形成一个新语句while),因此这似乎不是问题。