C++11 の unique_ptr と shared_ptr は互いの型に変換できますか? 質問する

C++11 の unique_ptr と shared_ptr は互いの型に変換できますか? 質問する

std::shared_ptrC++11 標準ライブラリには、 からへ、またはその逆の変換を行うユーティリティが用意されていますかstd::unique_ptr? この操作は安全ですか?

ベストアンサー1

std::unique_ptrは、排他的所有権を表現する C++11 の方法です。しかし、その最も魅力的な機能の 1 つは、簡単かつ効率的に に変換できることですstd::shared_ptr

std::unique_ptrこれは、 がファクトリ関数の戻り型として非常に適している理由の重要な部分です。ファクトリ関数は、呼び出し元が返すオブジェクトに対して排他的所有権セマンティクスを使用するかどうか、または共有所有権 (つまりstd::shared_ptr) の方が適切かどうかを知ることはできません。 を返すことによりstd::unique_ptr、ファクトリは呼び出し元に最も効率的なスマート ポインターを提供しますが、呼び出し元がそれをより柔軟な兄弟に置き換えることを妨げることはありません。

std::shared_ptrstd::unique_ptr許可されません。リソースの有効期間管理を に引き渡したらstd::shared_ptr、考えを変えることはできません。参照カウントが 1 であっても、たとえば に管理させるためにリソースの所有権を取り戻すことはできませんstd::unique_ptr

参考資料: Effective Modern C++。C++11 と C++14 の使用を改善するための 42 の具体的な方法。Scott Meyers。

つまり、std::unique_ptrを に簡単かつ効率的に変換できますが、を にstd::shared_ptr変換することはできません。std::shared_ptrstd::unique_ptr

例えば:

std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);

または:

std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");

おすすめ記事