ホームページ > バックエンド開発 > C++ > `std::unique_ptr` には T の完全な定義が必要ですか?

`std::unique_ptr` には T の完全な定義が必要ですか?

Barbara Streisand
リリース: 2024-12-25 14:10:15
オリジナル
973 人が閲覧しました

Does `std::unique_ptr` Need a Complete Definition of T?

は std::unique_ptr です。 T の完全な定義を知る必要がありますか?

std::unique_ptr は std::unique_ptr です。管理するタイプ T の完全な定義が必要ですか?この疑問は、std::unique_ptr が std::unique_ptr であるという観察から生じます。 Thing が前方宣言されている場合、Visual Studio 2010 SP1 でコンパイルに失敗します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート