我有一个类型,我已经删除了复制构造函数,我想有一个vector
这种类型,所以我需要通过创建所有元素emplace_back
.但是,emplace_back
似乎需要一个复制构造函数,因为编译器会发出一个关于无法实例化的警告,emplace_back
因为复制构造函数已被删除.为什么需要复制构造函数?我认为重点emplace_back
是建立vector
没有复制任何东西.我甚至可以拥有一个vector
没有复制构造函数的对象吗?
class MyType { public: MyType(std::arraya) {} 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.
当vector
内部存储增长时,需要将元素从旧存储移动到新存储.通过删除复制构造函数,还可以防止它生成默认移动构造函数.
为了能够调用emplace_back,您的类型应该是EmplaceConstructible或MoveInsertible.如果删除了复制构造函数,则需要为类提供移动构造函数.(检查这是否有emplace_back的要求)
MyType(MyType &&a) {/*code*/} //move constructor