有人可以对这两个术语提供更清晰的解释吗?
换句话说,请给出一些简单的例子说明。
最佳答案
这些要求是T
类型和容器X
之间的关系。容器具有分配器类型A
,它用于为其包含的对象分配内存。
如果m
是这些分配器之一,则p
是T*
,rv
是T
类型的右值,v
是T
类型的表达式:
CopyInsertable
由标准使用以下内容定义:MoveInsertable
由标准使用以下内容定义:现在要了解这些定义,我们必须知道
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
编辑。当然,这些将分别调用copy或move构造函数。
所以:
T
是CopyInsertable
到X
:X
的分配器可以放置新构造T
的元素,并传递T
类型的表达式T
是MoveInsertable
到X
:X
的分配器可以放置新构造T
的元素,并传递T
类型的值r 关于c++ - MoveInsertable和CopyInsertable之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14916005/