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