有人可以对这两个术语提供更清晰的解释吗?
换句话说,请用一个例子进行一些简单的解释。
(来自:cppreference.com)
MoveInsertable :指定可以将类型的右值复制到未初始化的存储中。
CopyInsertable :指定可以在未初始化的存储中就地复制构造该类型的实例。
有人可以对这两个术语提供更清晰的解释吗?
换句话说,请用一个例子进行一些简单的解释。
(来自:cppreference.com)
MoveInsertable :指定可以将类型的右值复制到未初始化的存储中。
CopyInsertable :指定可以在未初始化的存储中就地复制构造该类型的实例。
T这些需求是类型和容器之间的关系X。容器有一个分配器类型 ,A它用于为其包含的对象分配内存。
Ifm是这些分配器之一,pa T*,rv类型的右值和类型T的v表达式T:
CopyInsertable由标准定义:
TisCopyInsertableintoX表示以下表达式是合式的:allocator_traits<A>::construct(m, p, v);
MoveInsertable由标准定义:
TisMoveInsertableintoX表示以下表达式是合式的: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
当然,这些将分别调用复制或移动构造函数。
所以:
Tis CopyInsertableintoX:canplacement X-new 的分配器构造一个元素T,传递一个类型的表达式TTis MoveInsertableintoX:canplacement X-new 的分配器构造一个元素T,传递一个类型的右值T