Aje*_*nga 5 c++ compiler-construction c++11
有人可以对这两个术语提供更清晰的解释吗?
换句话说,请举例说明一些简单的解释.
(来自:cppreference.com)
MoveInsertable:指定可以在未初始化的存储中复制该类型的右值.
CopyInsertable:指定可以在未初始化的存储中就地复制构造类型的实例.
这些要求是类型T和容器之间的关系X.容器具有分配器类型,A用于为其包含的对象分配内存.
如果m是这些分配器中的一个,p一T*,rv类型的右值T,和v类型的表达式T:
CopyInsertable 由标准定义:
T是CopyInsertable进入X装置,以下表达式是公形成:Run Code Online (Sandbox Code Playgroud)allocator_traits<A>::construct(m, p, v);
MoveInsertable 由标准定义:
T是MoveInsertable进入X装置,以下表达式是公形成:Run Code Online (Sandbox Code Playgroud)allocator_traits<A>::construct(m, p, rv);
现在要了解这些定义,我们必须知道它是什么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)
再次,v和rv被std::forward编
当然,这些将分别调用复制或移动构造函数.
所以:
Tis CopyInsertableintoX:Xcan placement for can placement-new构造一个元素T,传递一个类型的表达式TT是MoveInsertable成X:分配器用于X罐放置新构造的元件T,传递类型的右值T