C++ 11標準ライブラリは、std::shared_ptr
からstd::unique_ptr
に変換するユーティリティを提供していますか?この安全な操作ですか?C++ 11のunique_ptrとshared_ptrはお互いの型に変換できますか?
答えて
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_ptr
にstd::unique_ptr
を変換することができますが、std::unique_ptr
にstd::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");
考えるunique_ptrをu_ptr、shared_ptrのs_ptr作成:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
他の道を行くことは非現実的です。
これは "正しい"方法です: 'std :: shared_ptrs_ptr(std :: move(u_ptr));' – emlai
そして、s_ptr {std :: move(u_ptr)}; ' – polyvertex
- 1. C++ 11とC++ 03のライブラリ互換性
- 2. C++ unique_ptrまたはshared_ptrのいずれかにこのポインタを代入する
- 3. shared_ptrからweak_ptr多型への変換
- 4. C++でshared_ptrをC++ 11(std :: shared_ptr)に割り当てる:shared_ptrを一時変数に初期化するのはまだ悪いですか?
- 5. ローカルのunique_ptrをshared_ptrとして返す
- 6. C++でのshared_ptrのアトミック操作11
- 7. Cの型から型に代入するときにエラーが発生する互換性のない型
- 8. コンパイルエラーの互換性のない型:java.sql.ConnectionをConnectionに変換できません
- 9. 互換性のない型:voidをintに変換することはできません。エラーのあるノート
- 10. エラー:互換性のない型:アプリケーションはAnalyticsApplication:Androidのメーカーに変換することはできません2.3.2
- 11. エラー:互換性のない型オブジェクトを(Javaクラス)に変換できません
- 12. 互換性のない型:android.support.v4.app.FragmentManagerに変換できません
- 13. エラー:互換性のない型:オブジェクトをMyClassに変換できません
- 14. エラー:互換性のない型:int []をintに変換できません
- 15. エラー:互換性のない型:java.lang.ObjectをEに変換できません
- 16. Javaエラー:互換性のない型:intをFloatに変換できません
- 17. エラー:互換性のない型:byte []をintに変換できません。 Image
- 18. Javaエラー:「互換性のない型:intをPlayerに変換できません」
- 19. 互換性のない型:java.lang.Stringをbooleanに変換できません
- 20. エラー:互換性のない型:ActionProviderをShareActionProviderに変換できません。
- 21. (C)互換性のないポインタ型[LPCWSTR]
- 22. C - 互換性のないポインタ型
- 23. C++ 11のshared_ptrの割り当て
- 24. C++ 11 unique_ptrをカスタムディテクタで使用
- 25. std :: unique_ptr、カスタムディテクタと型変更
- 26. 互換性のない型int []はint型のエラーに変換できません
- 27. C++ 11プリミティブデータ型のみをアトミックに宣言できますか?
- 28. C++ 11ランダムヘッダと互換性のあるカスタムディストリビューションを作成する
- 29. 互換性のない型:文字列をintに変換することはできません
- 30. 互換性のない型:java.util.lang.Stringをstringdemo.Stringに変換することはできません
「安全な操作」を定義してください。あなたはどんな安全性を求めていますか?生涯管理の安全性?スレッドの安全性? – jaggedSpire
"STL"は標準ライブラリを意味するものではありません。 STLは 'shared_ptr'とは何の関係もありません。 – curiousguy
@jaggedSpireスレッドの安全性とは、所有者が別のスレッドで使用されている、つまり使用回数が1ではないことを意味します。 – curiousguy