MoveInsertable 和 CopyInsertable 之间的区别
Difference between MoveInsertable and CopyInsertable?
有人能对这两个术语提供更清晰的解释吗?
换句话说,请用一个例子进行一些简单的解释。
(来自 : cppreference.com(
MoveInsertable :指定 可以在未初始化的存储中复制该类型的 rvalue 。
CopyInsertable :指定 类型可以在未初始化的存储中就地复制构造。
这些要求是类型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
成员函数有什么作用呢?好吧,正如您所料,它通过执行以下操作在位置p
构造一个类型为 T
的对象:
::new ((void*)p) T(v) // CopyInsertable case
::new ((void*)p) T(rv) // MoveInsertable case
同样,v
和rv
std::forward
编辑。
当然,这些将分别调用复制或移动构造函数。
所以:
-
T
被CopyInsertable
X
:X
的分配器可以放置新构造一个T
的元素,传递一个类型T
的表达式 -
T
被MoveInsertable
X
:X
的分配器可以放置新构造一个T
元素,传递一个类型T
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?