std::mutex 引起的 C2280 尝试引用已删除的函数
Posted lzpong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std::mutex 引起的 C2280 尝试引用已删除的函数相关的知识,希望对你有一定的参考价值。
起因是把之前写的类中的 mutex 使用了(之前注释掉了没用到这个变量);
或者说添加了一个 mutex 变量, 然后 这个类有嵌套在了 其类的 map 中使用, 然后 编译 就报错
`
C2280 XXX:XXX(const XXX &) 尝试引用已删除的函数
C2280 XXX::operator=(const XXX &) 尝试引用已删除的函数
`
手动添加 这俩函数, 依然包错
死活折腾不起作用, 在网上搜的, 说什么 const 变量啦,析构函数啦.... 等等都无效
后来, 折腾的没办法, 重新 check 上个版本的 工程( 嗯, 幸好有svn )
然后 一点一点 添加变化, 添加一点 编译一次,添加一点 编译一次
终于发现, TMD 是添加 了 mutex 变量后 就报错的
然后网上 搜了下, 直接给了解释:
`
由于std::mutex的拷贝构造函数被禁了:
mutex( const mutex& ) = delete;
`
麻蛋!~
而 std::vector 和 std::map 都是要求 类型 必须包含拷贝构造函数的,所以就报错了。
且 即时 添加 mutable 关键字,也无效的.
最简单的方法就是 :
把 std::mutex _mutex ;改成 std::shared_ptr<std::mutex> _mutex 就可以了
使用的时候
std::lock_guard<std::mutex> _lock{ *_mutex }; // `*`解释得到
或者自己手动 这两个函数吧....
看情况, 如果担心 多线程 是什么莫名其妙的锁了, 就手动 咯, 虽然说写的
以上是关于std::mutex 引起的 C2280 尝试引用已删除的函数的主要内容,如果未能解决你的问题,请参考以下文章
编译器错误 C2280,试图引用已删除的函数 operator=
将 std::thread 与 std::mutex 一起使用
Visual Studio 2013 和 2015 中的 C++ 编译器错误 C2280“试图引用已删除的函数”