MoveInsertable和CopyInsertable之间的区别?

时间:2013-02-16 22:51:39

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

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

换句话说,请举例说明一些简单的解释。

  

(来自:cppreference.com)

     

MoveInsertable:指定a   可以在未初始化的存储中复制该类型的右值。

     

CopyInsertable:指定一个实例   type可以在未初始化的存储中就地复制。

1 个答案:

答案 0 :(得分:6)

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

如果m是其中一个分配器,则pT*rvT的左值,v为表达式类型为T

  1. CopyInsertable由标准定义:

      

    T CopyInsertableX表示以下表达式格式正确:

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

      

    T MoveInsertableX表示以下表达式格式正确:

    allocator_traits<A>::construct(m, p, rv);
    
  3. 现在要了解这些定义,我们必须知道allocator_traits<A>::construct的作用。很简单,在这种情况下它会调用:

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

    vrv此处仍有各自的值类别,因为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. T CopyInsertableX X的分配器可以将placement-new构造为T的元素,传递T
    2. 类型的表达式
    3. T MoveInsertableX X的分配器可以将placement-new构造为T的元素,传递T
    4. 类型的右值