[英]Why default constructor doesn't work for `vector::emplace_back`
[英]Why doesn't this use of emplace_back with deleted copy constructor work?
我有一个类型,我已经删除了复制构造函数,我想有一个这种类型的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。
当vector
的内部存储增长时,需要将元素从旧存储移动到新存储。 通过删除复制构造函数,还可以防止它生成默认移动构造函数。
为了能够调用emplace_back,您的类型应该是EmplaceConstructible或MoveInsertible 。 如果删除了复制构造函数,则需要为类提供移动构造函数。 (检查这是否有emplace_back的要求)
MyType(MyType &&a) {/*code*/} //move constructor
如果您尝试运行此代码:
// Example program
#include <iostream>
#include <string>
#include <array>
#include <vector>
class MyType {
public:
MyType(std::array<double, 6> a) {
std::cout<< "constructed from array\n";
}
MyType(const MyType& that){
std::cout<< "copy\n";
}
MyType(MyType&& that){
std::cout<< "move\n";
}
};
int main() {
std::vector<MyType> v;
std::array<double, 6> a = {1,2,3,4,5,6};
v.emplace_back(a);
}
您将获得以下结果:
从数组构造
很明显,只调用std::Array
的constructor
。 所以,不需要copy constructor
。 但如果你同时deleted
的copy constructor
,编译器会产生一个错误(至少在两种编译器我想第一 第二 )。 我认为一些编译器在使用emplace_back时会检查是否存在copy constructor
,即使在这种实际情况下没有必要,而其他编译器也不会。 我不知道这里的标准是什么(哪个编译器是对还是错)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.