引用列表元素然后弹出它,它是未定义的行为吗?
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 当 begin
和 end
迭代器比较相等时为真。当begin到end的距离为0时size为0.
据我所知,这都是明确定义的行为。
我有这段代码,我想知道它是否有效或是否会导致未定义的行为:
#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 当 begin
和 end
迭代器比较相等时为真。当begin到end的距离为0时size为0.
据我所知,这都是明确定义的行为。