ホームページ >バックエンド開発 >C++ >Pimpl イディオムで不完全な型があると `std::unique_ptr` が失敗するのはなぜですか?

Pimpl イディオムで不完全な型があると `std::unique_ptr` が失敗するのはなぜですか?

DDD
DDDオリジナル
2024-12-13 05:01:11464ブラウズ

Why Does `std::unique_ptr` Fail with Incomplete Types in Pimpl Idiom?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。