c++ - MoveInsertable 和 CopyInsertable 之间的区别?

标签 c++ compiler-construction c++11

有人可以对这两个术语进行更清晰的解释吗?

换句话说,请通过示例进行一些简单的解释。

(from : cppreference.com)

MoveInsertable : Specifies that a rvalue of the type can be copied in uninitialized storage.

CopyInsertable : Specifies that an instance of the type can be copy-constructed in-place, in uninitialized storage.

最佳答案

这些要求是一个类型T之间的关系和一个容器 X .一个容器有一个分配器类型,A ,它用于为其包含的对象分配内存。

如果m是这些分配器之一,p一个T* , rv T 类型的右值, 和 v T 类型的表达式:

  1. CopyInsertable由标准定义:

    T is CopyInsertable into X means that the following expression is well-formed:

    allocator_traits<A>::construct(m, p, v);
    
  2. MoveInsertable由标准定义:

    T is MoveInsertable into X means that the following expression is well-formed:

    allocator_traits<A>::construct(m, p, rv);
    

现在要理解这些定义,我们必须知道什么是allocator_traits<A>::construct做。很简单,在这种情况下它调用:

m.construct(p, v) // CopyInsertable case
m.construct(p, rv) // MoveInsertable case

vrv这里仍然有各自的值(value)类别,因为 std::forward应用于 allocator_traits<A>::construct 的参数.

那么分配器 construct 是做什么的?成员函数呢?好吧,正如您所料,它构造了一个 T 类型的对象。在位置p通过做:

::new ((void*)p) T(v) // CopyInsertable case
::new ((void*)p) T(rv) // MoveInsertable case

再次,vrvstd::forward编辑。

当然,这些将分别调用复制或移动构造函数。

所以:

  1. TCopyInsertable进入X :X 的分配器placement-new 可以构建 T 的元素吗? , 传递 T 类型的表达式
  2. TMoveInsertable进入X :X 的分配器placement-new 可以构建 T 的元素吗? , 传递类型为 T 的右值

关于c++ - MoveInsertable 和 CopyInsertable 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14916005/

相关文章:

c++ - 接受通用引用并返回 const 引用的函数的莫名行为

c++ - libstdc++ 拒绝将 volatile 右值分配给 std::ignore 是错误的吗?

c++ - 没有用户代码的死锁

c++ - 使角色在屏幕中移动时,window.clear() 如何在 SFML 中工作?

c++ - 链接器如何处理链接到共享库的 C++ 静态库的唯一类型信息约束?

c++ - 在 C++ 中使用调用查找函数定义

c++ - 编译和执行 Qt 应用程序

c++ - 如何为 Linux 重新分发已编译的专有软件?

c++ - 将 '\0' 放入数组最后一个元素之后的 char[] 是否安全?

ubuntu - 将 optirun 和 g++ 设置为编译器以在 Ubuntu 中编译 OpenCL