は std::unique_ptr
std::unique_ptr
Visual Studio 2010 SP1 の実装に依存する動作
Visual Studio 2010 SP1 の動作は、次のことを示唆しています。 std::unique_ptr の実装には、次の完全な定義が必要であること もの。これは標準要件ではなく、実装固有の選択です。
標準ライブラリの部分的な例外
ほとんどの C 標準ライブラリ テンプレートは完全型を必要としますが、std ::shared_ptr と std::unique_ptr は部分的な例外です。これらの関数の一部は、実装へのポインター (pimpl) パターンなどのイディオムをサポートする役割により、不完全な型でインスタンス化される可能性があります。ただし、特定の操作で不完全な型を使用すると、不完全なオブジェクトの削除などの未定義の動作が発生する可能性があります。
さまざまな操作の型の完全性要件
std::unique_ptr およびstd::shared_ptr では、さまざまな状況で完全な型が必要です。たとえば、~std::unique_ptr はデストラクターに完全な型を必要としますが、std::unique_ptr(A*) はポインターが引き継がれる場合に不完全な型を許可します。これらの要件を表にまとめます。
Operation | std::unique_ptr | std::shared_ptr |
---|---|---|
Default constructor | incomplete | incomplete |
Copy constructor | - | incomplete |
Move constructor | incomplete | incomplete |
Destructor | complete | incomplete |
Constructor from pointer | incomplete | complete |
Copy assignment | - | incomplete |
Move assignment | complete | incomplete |
Reset without argument | complete | incomplete |
Reset with argument | complete | complete |
結論として、std::unique_ptr は本質的に C 標準での完全な型定義を必要としませんが、一部の実装 (Visual Studio 2010 SP1 など) ではそのような要件を課す場合があります。 。未定義の動作を避けるために、使用されている実装の特定の要件を認識することが重要です。
以上が`std::unique_ptr` には T の完全な定義が必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。