错误:使用已删除的函数'std :: thread :: thread(const std :: thread&)'

用户名

下面的代码可以编译并按预期工作。该结构(类)A从导出std::thread和膨胀具有int更多。main代码创建了一些线程,然后等待它们完成。

问题是,虽然代码在struct中没有析构函数的情况下进行编译A,但是当析构函数未注释~A(){})时,我得到:

错误:使用已删除的函数'std :: thread :: thread(const std :: thread&)'

我不知道为什么。

而且我不理解为什么代码根据我的理解不能同时使用push_backemplace_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;

恢复隐式移动ctor。


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

您看到的(误导性)错误是STL试图回退无法移动的复制类型,并且由于std::thread故意不可复制而失败

有关隐式声明的move构造函数,请参见此cppreference页的部分,以及有关其他相关动机的其他问题

造成混乱的第二个原因是push_back移动重载,因此您的原始代码从不复制,而仅在复制。如果您想证明这一点,请对dtor进行注释,使其再次起作用,然后尝试对push_backconst进行const引用A它将抱怨复制构造函数,这意味着其他push_back调用未使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章