MoveInsertable和CopyInsertable之间的区别?

Aje*_*nga 5 c++ compiler-construction c++11

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

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

(来自:cppreference.com)

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

CopyInsertable:指定可以在未初始化的存储中就地复制构造类型的实例.

Jos*_*eld 6

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

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

  1. CopyInsertable 由标准定义:

    TCopyInsertable进入X装置,以下表达式是公形成:

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

    TMoveInsertable进入X装置,以下表达式是公形成:

    allocator_traits<A>::construct(m, p, rv);
    
    Run Code Online (Sandbox Code Playgroud)

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

m.construct(p, v) // CopyInsertable case
m.construct(p, rv) // MoveInsertable case
Run Code Online (Sandbox Code Playgroud)

v并且rv在这里仍然有各自的值类别,因为std::forward它适用于.的参数allocator_traits<A>::construct.

那么分配器construct成员函数做什么呢?好吧,正如您所料,它通过执行以下操作T在该位置构造类型的对象p:

::new ((void*)p) T(v) // CopyInsertable case
::new ((void*)p) T(rv) // MoveInsertable case
Run Code Online (Sandbox Code Playgroud)

再次,vrvstd::forward

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

所以:

  1. Tis CopyInsertableintoX:Xcan placement for can placement-new构造一个元素T,传递一个类型的表达式T
  2. TMoveInsertableX:分配器用于X罐放置新构造的元件T,传递类型的右值T