【发布时间】:2016-04-05 06:32:57
【问题描述】:
我有一个类型,我已经从中删除了复制构造函数,并且我想要一个这种类型的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);
}
编译器是clang/llvm。
【问题讨论】:
-
cpp.sh/9v5w 这里不起作用
-
这里还有goo.gl/eLUPjR
-
emplace_back不需要复制构造函数,但是当vector的容量不足以存储新元素时,vector需要重新分配其元素,这需要复制/移动构造函数。通过删除复制构造函数,您还可以防止它生成默认的移动构造函数。在这种情况下,声明一个移动构造函数可能会起作用
标签: c++ constructor stdvector emplace