繁体   English   中英

为什么这个使用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,您的类型应该是EmplaceConstructibleMoveInsertible 如果删除了复制构造函数,则需要为类提供移动构造函数。 (检查是否有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::Arrayconstructor 所以,不需要copy constructor 但如果你同时deletedcopy constructor ,编译器会产生一个错误(至少在两种编译器我想第一 第二 )。 我认为一些编译器在使用emplace_back时会检查是否存在copy constructor ,即使在这种实际情况下没有必要,而其他编译器也不会。 我不知道这里的标准是什么(哪个编译器是对还是错)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM