vec.erase(vec.end()); 法律?

Arm*_*yan 2 c++ stl erase

顺序容器可以擦除吗?

在标准中它说:

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

目前尚不清楚a.erase(a.end())顺序容器是否为no-op或UB.想法?

T.C*_*.C. 10

§23.2.3[sequence.reqmts]/p3(强调我的):

在表100和101中,X表示一个序列容器类,表示包含类型元素的a值,[...] 表示有效的可解除引用的const迭代器.XTqa

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

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


BЈо*_*вић 5

如果我们将此参考页用于erase():

迭代器pos必须是有效且可解除引用的.因此,end()迭代器(有效但不可解除引用)不能用作pos的值.

所以,不 - 它无效.

  • 很高兴看到标准的哪一部分是cppreference.com所指的时间. (3认同)
  • @ArmenTsirunyan年龄,cppreference通常包括非规范性的笔记. (2认同)