MoveInsertable 和 CopyInsertable 之间的区别

Difference between MoveInsertable and CopyInsertable?

本文关键字:区别 之间 CopyInsertable MoveInsertable      更新时间:2023-10-16

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

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

(来自 : cppreference.com(

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

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

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

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

  1. CopyInsertable由标准定义

    T CopyInsertable X意味着以下表达式的格式正确:

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

    T MoveInsertable X意味着以下表达式的格式正确:

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

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

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

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

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

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

同样,vrv std::forward编辑。

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

所以:

  1. TCopyInsertable XX的分配器可以放置新构造一个T的元素,传递一个类型T的表达式
  2. TMoveInsertable XX的分配器可以放置新构造一个T元素,传递一个类型T