gpt4 book ai didi

c++ - 错误 : use of deleted function ‘std::thread::thread(const std::thread&)'

转载 作者:可可西里 更新时间:2023-11-01 16:36:17 26 4
gpt4 key购买 nike

下面的代码编译并按预期工作。结构(类)A 派生自 std::thread 并扩展了一个 intmain 代码创建一些线程,然后等待它们完成。

问题在于,虽然代码编译时没有结构 A 中的析构函数,但当析构函数未注释时(~A(){} ) 我得到:

error: use of deleted function ‘std::thread::thread(const std::thread&)'

我不知道为什么。

此外,我不明白为什么代码既适用于 push_back 也适用于 emplace_back 而根据我的理解它不应该适用于 push_back.

#include <iostream>
#include <thread>
#include <vector>

struct A : std::thread {
int i;
A(void f(const char*),const char* s,int i_) : std::thread{f,s},i{i_}{
std::cout<<"A created"<<std::endl;
}
//~A(){} // uncomment to see error
};

void dosomething(const char* s){
std::cout<<s<<std::endl;
}

int main(){
std::vector<A> aa;
aa.emplace_back(&dosomething,"hi people",3434);
aa.push_back(A(&dosomething,"hi again people",777));
aa.emplace_back(&dosomething,"hi again people",777);
aa.push_back(A(&dosomething,"hi again people",777));

for(auto& i:aa) i.join();
}

最佳答案

如果你想要析构函数,你可以通过添加来修复你的代码

A(A &&) = default;

恢复隐式移动构造函数。


您的第一个问题是添加用户定义的析构函数会禁用move 构造函数的隐式生成。

您看到的(误导性)错误是 STL 试图回退到无法移动的复制类型,但失败了,因为 std::thread 是故意不可复制的。

查看此 cppreference page关于隐式声明的移动构造函数的部分,以及这个 other question一些相关的动机。

第二个混淆来源是 push_back 有一个 move 重载,所以你的原始代码从来没有首先复制,只是移动。如果您想证明这一点,请将 dtor 注释掉以使其再次运行,然后尝试 push_backA 的 const 引用。它会提示复制构造函数,这意味着其他 push_back 调用没有使用它。

关于c++ - 错误 : use of deleted function ‘std::thread::thread(const std::thread&)' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27473809/

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