此代码是否在C ++标准库中定义了行为?
std::forward_list<T> list;
list.erase_after(list.before_begin());
直觉会说不,但我还没能找到这个特定情况的确切标准措辞。
答案 0 :(得分:5)
erase_after
的先决条件是:
iterator erase_after(const_iterator position);
需要:
position
之后的迭代器是可解除引用的。
因此,您的示例具有未定义的行为,因为list
为空,因此list.before_begin()
不可递增,因此后面没有迭代器。
如果列表至少有一个元素,则list.erase_after(list.before_begin())
有效。