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

换句话说,请给出一些简单的例子说明。

最佳答案

这些要求是T类型和容器X之间的关系。容器具有分配器类型A,它用于为其包含的对象分配内存。
如果m是这些分配器之一,则pT*rvT类型的右值,vT类型的表达式:

  • CopyInsertable由标准使用以下内容定义:

  • MoveInsertable由标准使用以下内容定义:


  • 现在要了解这些定义,我们必须知道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编辑。
    当然,这些将分别调用copy或move构造函数。
    所以:
  • TCopyInsertableX :X的分配器可以放置新构造T的元素,并传递T类型的表达式
  • TMoveInsertableX :X的分配器可以放置新构造T的元素,并传递T类型的值r
  • 关于c++ - MoveInsertable和CopyInsertable之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14916005/

    10-09 13:21