6

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

换句话说,请用一个例子进行一些简单的解释。

(来自:cppreference.com)

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

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

4

1 回答 1

8

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

Ifm是这些分配器之一,pa T*rv类型的右值和类型Tv表达式T

  1. CopyInsertable由标准定义:

    Tis CopyInsertableintoX表示以下表达式是合式的:

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

    Tis MoveInsertableintoX表示以下表达式是合式的:

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

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

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

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

再次,并被v编辑。rvstd::forward

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

所以:

  1. Tis CopyInsertableintoX:canplacement X-new 的分配器构造一个元素T,传递一个类型的表达式T
  2. Tis MoveInsertableintoX:canplacement X-new 的分配器构造一个元素T,传递一个类型的右值T
于 2013-02-16T23:07:12.647 回答