当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么这个使用emplace_back与删除的拷贝构造函数不起作用?》经验,为你挑选了2个好方法。

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

class MyType {
public:
    MyType(std::array a) {}
    MyType(const MyType& that) = delete;
};

int main() {
    std::vector v;
    std::array a = {1,2,3,4,5,6};
    v.emplace_back(a);
}

编译器是clang/llvm.



1> BoBTFish..:

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



2> bashrc..:

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

 MyType(MyType &&a) {/*code*/} //move constructor

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有