繁体   English   中英

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

[英]error: use of deleted function ‘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。


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

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

请参阅此cppreference页面关于隐式声明的移动构造函数的部分,以及针对某些相关动机的另一个问题

第二个混淆的原因是push_back有一个移动重载,所以你的原始代码从来没有复制过,只是移动。 如果你想证明这一点,评论的析构函数退了出来,因此再次工作,然后尝试push_back一个常量引用的A 它会抱怨复制构造函数,这意味着其他push_back调用没有使用它。

暂无
暂无

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

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