在回答的过程中的另一个问题,我偶然发现稍有不同的措辞为std::vector::erase()
和std::deque::erase()
。
这就是C ++ 14关于std::deque::erase
([deque.modifiers]/4-6
,重点是我的)的看法:
效果: ...
复杂性:析构函数的调用数与擦除的元素数相同,但是对赋值运算符的调用数不超过擦除的元素之前的元素数量和删除元素之后的元素数量中的较小者。擦除的元素。
抛出:除非的复制构造函数,move构造函数,赋值运算符或move赋值运算符抛出异常,否则什么都不会发生
T
。
它是关于std::vector::erase
([vector.modifiers]/3-5
)的内容:
效果: ...
复杂性:的析构函数的
T
调用次数等于擦除的元素数,但是的移动分配运算符的T
调用次数等于在擦除的元素之后向量中的元素数。抛出:除非的复制构造函数,move构造函数,赋值运算符或move赋值运算符抛出异常,否则什么都不会发生
T
。
如您所见,它们的异常规范是相同的,但是std::vector
明确提到了调用移动赋值运算符。
还有的要求T
是MoveAssignable
对erase()
与这两个工作std::vector
和std::deque
(表100),但这并不意味着移动赋值运算符的存在:一个可以定义一个拷贝赋值运算符,而不是定义移动赋值操作符,而这个班会是MoveAssignable
。
为了以防万一,我检查了GCC和Clang,并确实std::vector::erase()
在没有移动分配运算符的情况下调用了复制分配运算符,并且std::deque::erase()
执行了同样的操作(DEMO)。
所以问题是:我错过了什么吗,或者这是标准中的(编辑)问题?
更新: 我已经提交了LWG问题#2477。