顺序容器可以擦除结束吗?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的顺序容器。想法?
顺序容器可以擦除结束吗?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的顺序容器。想法?
§23.2.3[sequence.reqmts]/P3(重点煤矿):
在表100和101,
X
表示序列的容器类,一个 表示类型的值的X
a
包含元素T
,[...],q
表示a
的有效可解引用常量迭代器。
表100是包含a.erase(q)
的序列容器需求表。
换句话说,a.erase(a.end())
是UB。
来自cplusplus.com:“无效的位置或范围导致未定义的行为。”
如果我们使用this reference page for erase():
迭代器POS必须是有效的和提领。因此,end()迭代器(它是有效的,但不可取消)不能用作pos的值。
所以,不 - 这是无效的。
很高兴看到标准的哪一部分是cppreference.com提到它的时候。 – 2015-02-11 14:39:56
@ArmenTsirunyan老化,cppreference通常包括不规范的笔记。 – 2015-02-11 14:42:17
我只是看着那个,看起来像你懂的。 – 2015-02-11 14:45:29