gpt4 book ai didi

c++ - 编译器不使用 move c'tor/assignment oper?

转载 作者:行者123 更新时间:2023-11-30 02:40:11 25 4
gpt4 key购买 nike

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

错误出现在main()的第一行:

"Use of deleted function '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 .

那么为什么不能编译呢?

编辑

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

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


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

return 0;
}

t1 上执行了 move , 它调用了 t1 的 move 的成员,其中一个是 deque .所以每个成员在deque中 move 发生,都不是 atomic_int 类型

最佳答案

自 C++11 起,拥有一个仅包含默认可构造对象的容器是完全合法的,前提是您不使用任何要求对象可复制或可 move 的操作。

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

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

会尝试复制一个测试,这是无效的,因为它会尝试复制双端队列

关于c++ - 编译器不使用 move c'tor/assignment oper?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29151823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com