1. ホーム
  2. c++

[解決済み] C++11のunique_ptrとshared_ptrは相互に型変換できるのですか?

2022-09-01 18:02:17

質問

C++11 標準ライブラリは、.html ファイルから.html ファイルに変換するユーティリティを提供しますか。 std::shared_ptr から std::unique_ptr またはその逆は?これは安全な操作ですか?

どのように解決するのですか?

<ブロッククオート

std::unique_ptr は排他的所有権を表現する C++11 の方法ですが、その最も魅力的な特徴の 1 つは への変換が簡単で効率的であることが最大の魅力です。 std::shared_ptr .

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

std::shared_ptr から std::unique_ptr は許可されません。リソースの生涯管理を一旦 std::shared_ptr に引き渡したら、もうその考えは変えられません。たとえ参照カウントが1であっても、リソースの所有権を取り戻すことはできず、たとえば std::unique_ptr がそれを管理します。

参考文献 エフェクティブ・モダン・C++」。c++11とc++14の使い方を改善するための42の具体的な方法。Scott Meyers。

要するに、簡単かつ効率的に std::unique_ptrstd::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");