std :: vector :: erase()
和std :: deque :: erase()
的略微不同措辞。这是C ++14关于
std :: deque :: erase
( [deque.modifiers] / 4-6
,强调我自己)的说法:
这是关于效果: ...
复杂度:调用析构函数的次数与删除的元素数量相同,但赋值运算符的调用次数不超过被删除元素之前和被删除元素之后的元素数量中的较小者。
抛出:除非
T
的复制构造函数,移动构造函数,赋值运算符或移动赋值运算符抛出异常,否则不会抛出任何异常。
std :: vector :: erase
( [vector.modifiers] / 3-5
)的内容。
效果:...
复杂度:调用
T
的析构函数次数等于删除的元素数量,但是在删除元素之后,调用T
的移动赋值运算符的次数等于向量中元素的数量。抛出异常:除非
T
的复制构造函数、移动构造函数、赋值运算符或移动赋值运算符抛出异常,否则不会抛出异常。
正如您所看到的,它们的异常规范是相同的,但是对于std::vector
,明确提到了调用移动赋值运算符。
T
对于erase()
在std::vector
和std::deque
中都需要是MoveAssignable
(表100),但这并不意味着必须存在移动赋值运算符:可以定义一个复制赋值运算符而不定义移动赋值运算符,这个类仍然是MoveAssignable
。
为了确保,我检查了GCC和Clang,的确std::vector::erase()
在没有移动赋值运算符的情况下调用复制赋值运算符,而std::deque::erase()
也是如此(DEMO)。
因此问题是:我有遗漏吗?还是这是标准中的(编辑)问题?
更新: 我已经提交了LWG issue #2477。