std::mutex 引發的 C2280 嘗試引用已刪除的函數

原由是把以前寫的類中的 mutex 使用了(以前註釋掉了沒用到這個變量); 多線程

或者說添加了一個 mutex 變量, 而後 這個類有嵌套在了 其類的 map 中使用, 而後 編譯 就報錯svn

`函數

C2280 XXX:XXX(const XXX &) 嘗試引用已刪除的函數spa

C2280 XXX::operator=(const XXX &)  嘗試引用已刪除的函數線程

`編譯

手動添加 這倆函數, 依然包錯table

死活折騰不起做用, 在網上搜的, 說什麼 const 變量啦,析構函數啦.... 等等都無效class

後來, 折騰的沒辦法, 從新 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 };   // `*`解釋獲得

或者本身手動 這兩個函數吧....

看狀況, 若是擔憂 多線程 是什麼莫名其妙的鎖了, 就手動 咯, 雖說寫的

相關文章
相關標籤/搜索