std::unique_ptr: 完全な型定義への依存
C では、通常、標準ライブラリ内のテンプレートが完全な型でインスタンス化されます。ただし、std::unique_ptr と std::shared_ptr は注目すべき例外です。これらは不完全な型での部分的なインスタンス化を許可しますが、特定の操作では完全な型が必要です。
この区別は、不完全な型のオブジェクトを削除するときの潜在的な未定義の動作から生じます。 std::unique_ptr や std::shared_ptr などのスマート ポインターは、必要に応じて完全な型を要求し、デストラクターが正しく呼び出されるようにすることで、これを防ぐことを目的としています。
std::unique_ptr の型完全性要件
std::unique_ptr は特定のインスタンスで完全な型を必要とします。以下に要約します:
**操作 |
完全な型要件** |
デフォルト コンストラクター |
不完全 |
コピー コンストラクター |
N/A (unique_ptr にはコピーがありません)コンストラクター) |
移動コンストラクター |
不完全 |
デストラクター |
**Operation |
Complete Type Requirement** |
Default constructor |
Incomplete |
Copy constructor |
N/A (unique_ptr does not have a copy constructor) |
Move constructor |
Incomplete |
Destructor |
Complete |
Constructor from pointer |
Incomplete |
Copy assignment |
N/A (unique_ptr does not have a copy assignment operator) |
Move assignment |
Complete |
reset() |
Complete |
reset(A*) |
Complete |
完了
|
ポインタからのコンストラクタ |
不完全 |
コピー割り当て |
該当なし (unique_ptr にはコピー代入演算子がありません) |
移動割り当て |
完了 |
reset() |
完了
|
reset(A*) |
完了
|
違いfrom std::shared_ptr
std::shared_ptr と std::unique_ptr は完全性要件が異なります。 std::shared_ptr では、コピー コンストラクター、コピー代入、デストラクターなどの追加操作で不完全型を使用できます。これは、std::unique_ptr が静的デリーターを使用しているのに対し、動的デリーターが使用されているためです。結論std::unique_ptr と std::unique_ptr には部分的な例外がありますが、 std::shared_ptr では、必要に応じて完全な型が使用されるようにすることが重要です。このような場合に不完全な型が使用されると、コンパイラはコンパイル時エラーを生成します。これにより、未定義の動作が防止され、デストラクターが正しく実行されるようになります。
以上が`std::unique_ptr` に完全な型定義が必要になるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。