编译器不使用移动 c'tor / 赋值操作器?

Compiler not using move c'tor / assignment oper?

本文关键字:tor 赋值 操作器 移动 编译器      更新时间:2023-10-16

这个问题真的很简单。下面的示例代码中发生了什么导致它无法编译?

错误发生在main():的第一行

"使用已删除的函数'std::__atomic0::...__atomic_base(...)')"

#include <atomic>
#include <deque>
#include <vector>
using namespace std;
class Test {
public:
    deque<atomic_int> dq;
    Test(){}
};

int main(){
    vector<Test> v = { Test(), Test() };
    return 0;
}

我正在将其编译为c++0x代码,在其中我理解atomic类型可能无法复制?但无论哪种方式,行vector<Test> v = { Test(), Test() };都应该调用Test的默认move构造函数/赋值运算符,该运算符应该调用Test::dqmove构造器/赋值运算符来避免复制任何atomic_int

为什么不编译呢?

编辑

我的编译器将允许我将不可移动的对象添加到容器中,然后移动容器。见下文:

class Test {
public:
    deque<atomic_int> dq;
    Test(){
        dq.resize(10);
    }
};

int main(){
    Test t1;
    Test t2(std::move(t1));
    return 0;
}

t1执行移动,它调用t1的成员的移动,其中一个是deque。因此,deque中的每个成员都会发生移动,其中没有一个是atomic_int

类型

由于C++11,只要不使用任何要求对象可复制或可移动的操作,那么只包含默认可构造对象的容器是完全合法的。

但是,std::initializer_list只允许const访问其元素,这意味着您不能从它们中移动。因此

vector<Test> v = { Test(), Test() };

将尝试复制Test,这是无效的,因为它将尝试复制deque