有人可以对这两个术语进行更清晰的解释吗?
换句话说,请通过示例进行一些简单的解释。
(from : cppreference.com)
MoveInsertable : Specifies that a rvalue of the type can be copied in uninitialized storage.
CopyInsertable : Specifies that an instance of the type can be copy-constructed in-place, in uninitialized storage.
最佳答案
这些要求是一个类型T
之间的关系和一个容器 X
.一个容器有一个分配器类型,A
,它用于为其包含的对象分配内存。
如果m
是这些分配器之一,p
一个T*
, rv
T
类型的右值, 和 v
T
类型的表达式:
CopyInsertable
由标准定义:T
isCopyInsertable
intoX
means that the following expression is well-formed:allocator_traits<A>::construct(m, p, v);
MoveInsertable
由标准定义:T
isMoveInsertable
intoX
means that the following expression is well-formed: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
这里仍然有各自的值(value)类别,因为 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
的右值
关于c++ - MoveInsertable 和 CopyInsertable 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14916005/