2015-02-11 57 views
2

顺序容器可以擦除结束吗?vec.erase(vec.end());法律?

在标准的,它说:

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

目前尚不清楚,如果a.erase(a.end())是无操作或UB的顺序容器。想法?

回答

10

§23.2.3[sequence.reqmts]/P3(重点煤矿):

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

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

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

+1

我只是看着那个,看起来像你懂的。 – 2015-02-11 14:45:29

0

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

5

如果我们使用this reference page for erase()

迭代器POS必须是有效的和提领。因此,end()迭代器(它是有效的,但不可取消)不能用作pos的值。

所以,不 - 这是无效的。

+3

很高兴看到标准的哪一部分是cppreference.com提到它的时候。 – 2015-02-11 14:39:56

+2

@ArmenTsirunyan老化,cppreference通常包括不规范的笔记。 – 2015-02-11 14:42:17