vec.erase(vec.end()); Legal?

vec.erase(vec.end()); Legal?

本文关键字:vec Legal end erase      更新时间:2023-10-16

顺序容器能擦除结束吗?

在标准中,它说:

a.erase(q) 
Requires: For vector and deque, T shall be
MoveAssignable.
Effects: Erases the element pointed to by q

对于顺序容器,a.erase(a.end())是no-op还是UB尚不清楚。想法?

§23.2.3[sequence.reqmts]/p3(emphasis mine):

在表100和表101中,X表示序列容器类表示包含T、[…]、q类型元素的Xa值表示a的有效可解引用常量迭代器。

表100是包含a.erase(q)的序列容器需求表。

换句话说,a.erase(a.end())是UB。

如果我们使用此参考页进行擦除():

迭代器位置必须有效且可取消引用。因此,end()迭代器(有效,但不可取消引用)不能用作位置的值

所以,不,这是无效的。

来自cplusplus.com:"无效的位置或范围会导致未定义的行为。"