C++ error: use of deleted function


問題

使用traits接收來自中間件的變量,調用拷貝構造函數時提示use of deleted function錯誤。

解釋

仔細檢查對應類中定義了移動構造函數,而沒有顯式定義拷貝構造函數。而問題就出在這:

If the class definition does not explicitly declare a copy constructor, one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted; otherwise, it is defined as defaulted.

深究

聲明移動構造函數證明你的類需要深拷貝,對於包含指針的類,編譯器簡單的淺拷貝可能導致反復釋放或野指針問題。推廣至Copy constructor 、Move constructor 、Copy assignment operator 、Move assignment operator 、Destructor 這五個函數,定義了任何一個都會導致編譯器認為你在主動管理資源,原本默認生成的函數可能無法滿足需求甚至是錯誤的故被轉換為delete強制用戶手動實現,也就是rule of five規則。
一圖勝千言

參考

Copy constructors - cppreference.com
C++ class declarations


免責聲明!

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



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