是否保证容器会在 std::move 期间销毁现有对象?

问题描述 投票:0回答:1

考虑以下示例:

#include <iostream>
#include <vector>

class A {
public:
    A(const A&) = default;
    A(A&&) = default;
    A& operator=(const A&) = default;
    A& operator=(A&&) = default;

    A() = default;
    ~A() {
        std::cout << "~A()\n";
    }
};

int main() {
    std::vector<A> v1;
    std::vector<A> v2;

    v1.emplace_back();
    v1 = std::move(v2);
    std::cout << "moved\n";
}

输出为

~A()
moved

我的问题是:我可以依靠

std::move
来破坏
v1
里面的元素吗?或者换句话说,上面的输出是否有保证,或者我可以得到:

moved
~A()

如果后者是可能的,那将是令人惊讶的,但是我没有找到明确的答案,也没有在标准中找到任何明确的内容。如果移动赋值运算符是用

std::swap
或类似的实现,那可能会发生,但我没有找到关于这是否有效的可靠答案。

c++ language-lawyer move-semantics
1个回答
0
投票

虽然交换通常是移动分配的有效实现,但标准库容器有额外的要求。 表 73:

表情:

a = rv

返回类型:
X&

操作语义:
a
的所有现有元素要么被移动分配给要么被销毁
断言/注意前置/后置条件:后置条件:
a
等于
rv
在此赋值之前的值
复杂度:线性

所以交换是不够的,因为那不会移动分配给或破坏原来的

v1[0]

© www.soinside.com 2019 - 2024. All rights reserved.