c++ - 对象 move 后支持哪些操作?

标签 c++ c++11 move-semantics

<分区>

如果一个对象实际上被 move 到另一个位置,原始对象支持的操作是什么?

为了详细说明,我有一个类型 T使用可用的 move 构造函数。用下面的语句

T x{constructor-args};
T y{std::move(x)};

对象可以做什么x (前提是对象实际上使用 x 的可用 move 构造函数从 y move 到 T )?

具体而言,

  • x可以肯定地销毁。我可以假设 x move 后是否容易被破坏?
  • 可以x分配或 move 分配给一个新对象(我想是的,因为我看到很多swap使用这个)?
  • 我可以构建一个新的 object 对象来代替 x 吗? ?如果有任何机会允许这样做,那么是否有可能有一个 uninitialized_move它适用于(部分)重叠的源和目标范围,例如 std::copy不像std::uninitialized_copy

    T z{some-args};
    x = z; //or x = std::move(z);
    T u{some-args};
    new(&x) T{std::move(u)}; // or new(&x) T{u}; etc
    

最佳答案

无论您将其定义为什么。至少,结果 对象应该是可破坏的——它的析构函数将是 被调用,并且对象的状态应该是这样的 没有问题。

标准库保证它的对象是一些 相干状态。您可以调用任何成员函数:它是 未指定您得到什么返回,结果将是 连贯:如果您在已 move 的 vector 上调用 size, 您还可以使用小于该值的索引调用 operator[]size 返回(但在唯一合理的实现中, size 将返回 0,)。这可能不仅仅是什么 但是,需要有效使用;所有真正必要的 是调用析构函数会起作用。

为了更清楚,以 std::vector 为例:如果我们 假设通常的实现,有三个指针,开始, 结束和限制(或者它们被称为:限制意味着 一个超过分配内存的末尾,这样 capacity() 返回 limit - begin)。 move 后,标准将 要求所有三个指针都为空。多数情况 实现中,限制指针将不会被访问 析构函数,因此可删除的宽松要求将 如果只有 begin 和 end 指针设置为 null,则满足。

关于c++ - 对象 move 后支持哪些操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21933145/

相关文章:

c++ - 红黑树无效转换

c++ - 检测插入到 std::set 中的坏项

c++ - std::thread 参数(值与常量)

rust - 如何在for循环中从迭代器中获取多个值?

c++ - 为什么下面的代码也会调用拷贝构造函数呢?

c++ - C++中的线程控制台应用程序

c++ - 使用数据数组调用函数时的模板参数包扩展

c++ - 命名数组元素,或 union 内的结构和数组

rust - Rust 如何 move 不可复制的堆栈变量?

包含任何类型数据的 c++ 映射,包括 vector 、映射等;没有提升