2016-06-17 17 views
23

C++ 11標準ライブラリは、std::shared_ptrからstd::unique_ptrに変換するユーティリティを提供していますか?この安全な操作ですか?C++ 11のunique_ptrとshared_ptrはお互いの型に変換できますか?

+0

「安全な操作」を定義してください。あなたはどんな安全性を求めていますか?生涯管理の安全性?スレッドの安全性? – jaggedSpire

+0

"STL"は標準ライブラリを意味するものではありません。 STLは 'shared_ptr'とは何の関係もありません。 – curiousguy

+0

@jaggedSpireスレッドの安全性とは、所有者が別のスレッドで使用されている、つまり使用回数が1ではないことを意味します。 – curiousguy

答えて

36

std::unique_ptrは排他的所有権を表現するためのC++ 11の方法ですが、その 最も魅力的な特徴の一つは、それが簡単かつ効率的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を管理するために、リソースの所有権を再要求することはできません。

参考:Effective Modern C++。 42 C++ 11およびC++の使用を改善するための特別な方法14。スコットマイヤーズ。要するに

、あなたは簡単かつ効率的にstd::shared_ptrstd::unique_ptrを変換することができますが、std::unique_ptrstd::shared_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"); 
+5

...どうやってやるの? – Jake

+1

@Jake例を追加しました – chema989

0

考えるunique_ptrをu_ptr、shared_ptrのs_ptr作成:

std::shared_ptr<whatever> s_ptr(u_ptr.release()); 

他の道を行くことは非現実的です。

+13

これは "正しい"方法です: 'std :: shared_ptr​​s_ptr(std :: move(u_ptr));' – emlai

+0

そして、​​s_ptr {std :: move(u_ptr)}; ' – polyvertex

関連する問題