ホームページ >バックエンド開発 >C++ >不完全な型で `std::unique_ptr` を使用するとコンパイル エラーが発生するのはなぜですか?

不完全な型で `std::unique_ptr` を使用するとコンパイル エラーが発生するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-04 09:58:16282ブラウズ

Why Does Using `std::unique_ptr` with an Incomplete Type Cause a Compile Error?

不完全型コンパイル エラーのある std::unique_ptr

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 を使用する場合、デストラクターを宣言する必要があるという事実に起因します。

class foo {
  class impl;
  std::unique_ptr<impl> impl_;

public:
  foo(); // You may need a def. constructor to be defined elsewhere

  ~foo(); // Implement (with {}, or with = default;) where impl is complete
};

デストラクターが明示的に宣言されていない場合、コンパイラーはデフォルトのデストラクターを生成します。これには完全なデストラクターが必要です。 foo::impl クラスの宣言。これにより、不完全な型を操作するときにコンパイル エラーが発生する可能性があります。

この問題を解決するには、上記のコード スニペットに示すように、空の本体を使用するか、デフォルトに設定して、クラスのデストラクターを実装します。これにより、コンパイラは std::unique_ptr によって管理されるオブジェクトの破棄を適切に処理できるようになります。

さらに、不完全な型での std::unique_ptr の使用は、名前空間スコープではサポートされません。代わりに、以下のコード スニペットに示すように、デストラクターを提供するカスタム構造体内で std::unique_ptr をラップすることで回避策が利用できます。

class impl;
struct ptr_impl : std::unique_ptr<impl> {
  ~ptr_impl(); // Implement (empty body) elsewhere
} impl_;

以上が不完全な型で `std::unique_ptr` を使用するとコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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