在回答 另一个问题的过程中,我偶然发现 std::vector::erase()
和 std::deque::erase()
的词汇略有不同。
这就是 C + + 14对 std::deque::erase
([deque.modifiers]/4-6
,强调我的)所说的:
效果:。
复杂度: 调用析构函数的次数与擦除的元素数相同,但是 对 赋值运算符赋值运算符的调用次数不超过元素数的小数 在擦除的元素之前以及擦除的元素之后的元素数。
抛出: 没有异常,除非复制建构子、 move 构造函数、赋值运算符或 move 赋值运算符抛出异常。
下面是它对 std::vector::erase
([vector.modifiers]/3-5
)的描述:
效果:。
复杂度:
T
的析构函数被称为等于被擦除元素数的次数,而T
的 移动赋值运算符移动赋值运算符被称为等于向量中被擦除元素后的元素数的次数。抛出: 没有异常,除非复制建构子、 move 构造函数、赋值运算符或 move 赋值运算符抛出异常。
正如您可以看到的,它们的异常规范是相同的,但是对于 std::vector
,它明确提到移动赋值操作符被调用。
erase()
还需要 T
是 MoveAssignable
才能与 std::vector
和 std::deque
一起工作(表100) ,但这并不意味着移动赋值操作符的存在: 可以定义一个拷贝赋值操作符,而不定义移动赋值操作符,这个类将是 MoveAssignable
。
为了以防万一,我使用 GCC 和 Clang 进行了检查,如果没有移动赋值操作符,那么 std::vector::erase()
实际上会调用复制赋值操作符,而 std::deque::erase()
也会这样做(演示)。
所以问题是: 我是否遗漏了什么,或者这是标准中的一个(编辑)问题?
更新: 我提交了一份 劳工及福利局编号2477。