std::unique_ptr 和不完整類型:深入了解
考慮使用 std::unique_ptr:
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };但是,由於以下原因,出現了編譯錯誤不完整類型:“'sizeof'對不完整類型'uixx::window::window_impl'的無效應用”
傳統上,std::unique_ptr 與不完整型別相容。那麼,問題出在哪裡呢?
問題的癥結:破壞
關鍵在於破壞。如果 pimpl 與 unique_ptr 一起使用,則必須明確聲明析構函數:class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // Constructor may need external definition ~foo(); // Implement (braceless or with = default;) once impl is complete };如果沒有,編譯器會產生一個預設析構函數,需要完整聲明 foo::impl。
模板問題和靜態持續時間實例
使用模板建構函數,即使impl_ 成員未建構:template <typename T> foo::foo(T bar) { // Compiler requires knowledge of impl_ destruction at compile time! }此外,在命名空間成員未建構:
class impl; std::unique_ptr<impl> impl_;此外,在命名空間範圍內使用具有不完整類型的unique_ptr會失敗:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;編譯器需要知道如何銷毀此靜態持續時間物件。解決方法包括定義自訂類型:
以上是為什麼 Pimpl Idiom 中的'std::unique_ptr”因類型不完整而失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!