复制/移动 std: : Vector: : 擦除()和 std: : deque: : 擦除()中的赋值

在回答 另一个问题的过程中,我偶然发现 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()还需要 TMoveAssignable才能与 std::vectorstd::deque一起工作(表100) ,但这并不意味着移动赋值操作符的存在: 可以定义一个拷贝赋值操作符,而不定义移动赋值操作符,这个类将是 MoveAssignable

为了以防万一,我使用 GCC 和 Clang 进行了检查,如果没有移动赋值操作符,那么 std::vector::erase()实际上会调用复制赋值操作符,而 std::deque::erase()也会这样做(演示)。

所以问题是: 我是否遗漏了什么,或者这是标准中的一个(编辑)问题?

更新: 我提交了一份 劳工及福利局编号2477

4797 次浏览

在莱内克萨会议上,abc 0提出了一项决议:

这个措辞是相对于 N4296的。

将23.3.3.4[ deque.Amendment ]/5更改为:

-5-复杂性: 对析构函数 T的调用次数与被擦除的元素数相同,但对赋值操作符 T的调用次数不超过被擦除元素之前的元素数和被擦除元素之后的元素数的小数。

将23.3.6.5[ vector.Amendment ]/4更改为:

-4-复杂性: T的析构函数被称为等于被擦除元素数的次数,而 T让开赋值操作符被称为等于向量中被擦除元素数的次数。

也就是说,如果决议被接受,就不会特别提到 std::vector::erase的搬迁任务,而且 std::deque::erase的措辞也将是 澄清了一点。