std::vector emplace_back() 表示非复制可构造对象
std::vector emplace_back() for non copy constructible objects
考虑 en.cppreference.com 关于std::vector::emplace_back
的这句话
"将新元素附加到容器的末尾。该元素是 就地构造,即不执行复制或移动操作。 元素的构造函数被调用完全相同 提供给函数的参数。
和以下示例:
#include <vector>
struct A
{
A(int){}
A(A const&) = delete;
};
int main()
{
std::vector<A> vec;
vec.emplace_back(1);
return 0;
}
在线vec.emplace_back(1);
Visual Studio 2013/GCC报告:
错误 C2280:"A::A(常量 A &(":尝试引用已删除的函数
错误:使用已删除的函数"A::A(const A&(">
错误是否正确?你能解释一下为什么吗?
C++11 23.2.1 表 101 指出:
表达式:
a.emplace_back(args)
返回类型:
void
操作语义:追加使用
std::forward<Args>(args)...
构造的T
类型的对象。需要:T
应从args
EmplaceConstructible
X
。对于vector
,T
也应MoveInsertable
X
。
您的A
不满足MoveInsertable
要求,因为您没有移动构造函数,并且只有一个已删除的复制构造函数。使用std::vector
以外的容器,它可以工作。
像其他增加向量大小的函数一样,emplace_back
有条件地重新分配向量(如果当前容量不够大(。如果它这样做,那么它需要将现有元素从旧数组获取到新数组。
(某些类具有编译器生成的移动,但不是这个,因为您删除了复制构造函数(。因此,重新分配代码需要能够复制类型,而它不能。
当然,对于此调用,没有要复制的旧元素,但是无法实例化emplace_back
函数。
相关文章:
- 将包含不可复制对象的对插入到映射中
- 通用参考 l 值不复制对象
- 为什么具有 2 个参数参数的构造函数接受复制对象作为 1 个参数参数?
- 为什么从引用创建共享指针会复制对象?
- 当(且仅当)对象具有复制构造函数时,如何复制对象?
- 我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误
- 如何复制对象
- 如何构造不可移动不可复制对象的元组?
- 不可复制对象数组的 consexpr 初始化?
- 提升::可选与标准::不可复制对象的可选
- 如何在C++中通过引用复制对象
- 从指针复制对象
- 删除浅表的复制对象和源对象
- 使用realloc可以安全地重新分配琐碎的可复制对象的存储吗
- C 返回复制对象
- 如何将智能指针作为类属性来复制对象
- 为什么在复制对象时忽略顶级常量
- std::shared_ptr 在复制对象时导致问题
- 安全复制对象的替代方案
- 当类包含boost::container::flat_set时,复制对象时出错