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 };
傳統上,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 };
模板問題和靜態持續時間實例
使用模板建構函數,即使impl_ 成員未建構:template <typename T> foo::foo(T bar) { // Compiler requires knowledge of impl_ destruction at compile time! }
class impl; std::unique_ptr<impl> impl_;
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
以上是為什麼 Pimpl Idiom 中的'std::unique_ptr”因類型不完整而失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!