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 };ただし、次のような理由でコンパイルエラーが発生します。不完全な型:「不完全な型 'uixx::window::window_impl' への 'sizeof' の適用が無効です」伝統的に、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! }さらに、名前空間スコープで不完全な型を指定して unique_ptr を使用すると失敗します:
class impl; std::unique_ptr<impl> impl_;コンパイラーは次の方法を知る必要があります。この静的期間オブジェクトを破棄します。回避策には、カスタム タイプを定義することが含まれます:
以上がPimpl イディオムで不完全な型があると `std::unique_ptr` が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。