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::vectorstd::map 都是要求 類型 必須包含拷貝構造函數的,所以就報錯了。

 

且 即時 添加 mutable 關鍵字,也無效的.

 

最簡單的方法就是 :

把  std::mutex _mutex ;改成  std::shared_ptr<std::mutex> _mutex 就可以了 

使用的時候

    std::lock_guard<std::mutex> _lock{ *_mutex };   // `*`解釋得到

或者自己手動 這兩個函數吧....

看情況, 如果擔心 多線程 是什么莫名其妙的鎖了, 就手動 咯, 雖然說寫的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM