为什么这个使用emplace_back与删除的拷贝构造函数不起作用?

Dre*_*rew 19 c++ constructor stdvector emplace

我有一个类型,我已经删除了复制构造函数,我想有一个vector这种类型,所以我需要通过创建所有元素emplace_back.但是,emplace_back似乎需要一个复制构造函数,因为编译器会发出一个关于无法实例化的警告,emplace_back因为复制构造函数已被删除.为什么需要复制构造函数?我认为重点emplace_back是建立vector没有复制任何东西.我甚至可以拥有一个vector没有复制构造函数的对象吗?

class MyType {
public:
    MyType(std::array<double, 6> a) {}
    MyType(const MyType& that) = delete;
};

int main() {
    std::vector<MyType> v;
    std::array<double, 6> a = {1,2,3,4,5,6};
    v.emplace_back(a);
}
Run Code Online (Sandbox Code Playgroud)

编译器是clang/llvm.

BoB*_*ish 27

vector内部存储增长时,需要元素从旧存储移动到新存储.通过删除复制构造函数,还可以防止它生成默认移动构造函数.


bas*_*hrc 11

为了能够调用emplace_back,您的类型应该是EmplaceConstructibleMoveInsertible.如果删除了复制构造函数,则需要为类提供移动构造函数.(检查是否有emplace_back的要求)

 MyType(MyType &&a) {/*code*/} //move constructor
Run Code Online (Sandbox Code Playgroud)