类中添加std::mutex成员引发C2661编译错误求助
解决C2661编译错误:添加mutex成员后tuple构造失败
这个问题我之前碰到过,核心根源是**std::mutex是不可拷贝、不可移动的类型**。当你给MyNameSpace::myClass添加了mutex mu成员后,编译器会自动禁用myClass的拷贝构造函数和移动构造函数——因为类里包含了不可拷贝的成员类型。而错误提示里的tuple构造失败,大概率是你的Run()函数里存在以下操作:
- 创建
std::thread时,尝试拷贝myClass对象(比如传了*this而非指针this) - 使用
std::bind绑定成员函数时,捕获了myClass的实例拷贝 - 其他需要把
myClass对象放入tuple并触发拷贝的场景
因为tuple构造时需要拷贝传入的元素,但现在myClass无法被拷贝,就触发了C2661错误。
具体解决步骤:
检查并修改
Run()中的代码:如果是创建线程或绑定函数时传了*this,改成传递指针this。比如把:std::thread t(&myClass::SomeMemberFunc, *this);改成:
std::thread t(&myClass::SomeMemberFunc, this);这样传递的是对象指针,不会触发拷贝操作。
避免拷贝
myClass实例:所有需要使用myClass对象的场景,优先用指针(this或shared_ptr<myClass>)或引用(注意引用的生命周期,比如线程里不能用悬空引用),不要直接传递对象值。绝对不要尝试拷贝mutex:
std::mutex本身设计为不可拷贝,自定义拷贝构造函数手动处理mutex是非常危险的操作,会直接破坏线程同步逻辑,完全不推荐。
内容的提问来源于stack exchange,提问作者Amir Rasti
相关产品推荐
相关产品推荐

