繁体   English   中英

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(const A&)':尝试引用已删除的函数

错误:使用已删除的函数'A :: A(const A&)'

错误是否正确? 你能解释一下为什么吗?

C ++ 11 23.2.1表101说明:

表达式: a.emplace_back(args)

返回类型: void

操作语义:追加使用std::forward<Args>(args)...构造的T类型的对象。 要求: T应该是来自args EmplaceConstructibleX 对于vectorT也应该是MoveInsertableX

您的A MoveInsertable要求,因为您没有移动构造函数,并且只有一个已删除的复制构造函数。 使用除std::vector之外的容器, 它可以工作

与增加向量大小的其他函数一样, emplace_back有条件地重新分配向量(如果当前容量不够大)。 如果它这样做,那么它需要将旧数组中的现有元素转换为新数组。

您的类没有移动构造函数(某些类具有编译器生成的移动,但不是因为您删除了复制构造函数)。 因此重新分配代码需要能够复制类型,而不能。

当然,对于这个调用,没有要复制的旧元素,但是emplace_back函数无法实例化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM