有人可以对这两个术语提供更清晰的解释吗?
换句话说,请举例说明一些简单的解释。
(来自:cppreference.com)
MoveInsertable:指定a 可以在未初始化的存储中复制该类型的右值。
CopyInsertable:指定一个实例 type可以在未初始化的存储中就地复制。
答案 0 :(得分:6)
这些要求是类型T
和容器X
之间的关系。容器具有分配器类型A
,它用于为其包含的对象分配内存。
如果m
是其中一个分配器,则p
为T*
,rv
为T
的左值,v
为表达式类型为T
:
CopyInsertable
由标准定义:
T
CopyInsertable
为X
表示以下表达式格式正确:allocator_traits<A>::construct(m, p, v);
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
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
CopyInsertable
为X
:X
的分配器可以将placement-new构造为T
的元素,传递T
T
MoveInsertable
为X
:X
的分配器可以将placement-new构造为T
的元素,传递T