我有一个类型,我已经删除了其复制构造函数,并且我想要一个
vector
来存储这种类型,因此我需要通过emplace_back
创建所有元素。但是,emplace_back
似乎需要一个复制构造函数,因为编译器会发出有关无法实例化emplace_back
的警告,因为复制构造函数已被删除。为什么它需要复制构造函数?我认为emplace_back
的整个目的是在不复制任何内容的情况下构建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);
}
编译器是clang/llvm。
emplace_back
不需要复制构造函数,但当向量的容量不足以存储新元素时,向量需要重新分配其元素,这需要复制/移动构造函数。通过删除复制构造函数,您还可以防止它生成默认的移动构造函数。在这种情况下,声明一个移动构造函数可能会起作用。 - Danh