[英]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(const 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
函数无法实例化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.