C++11 unique_ptr和shared_ptr能够转换为彼此的类型吗?
Does C++11 unique_ptr and shared_ptr able to convert to each other's type?
C 11标准库是否提供了从std::shared_ptr
转换为std::unique_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
,就不会改变主意。即使参考计数是一个,您也无法收回资源的所有权,以便使std::unique_ptr
管理它。参考:有效的现代C 。42个特定方法来改善您对C 11和C 14的使用。斯科特·迈耶斯(Scott Meyers)。
简而言之,您可以轻松有效地将std::unique_ptr
转换为std::shared_ptr
,但不能将std::shared_ptr
转换为std::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");
我更喜欢这样做。
std::unique_ptr<int> up_ = std::make_unique<int>();
std::shared_ptr<int> sp_ = std::move(up_);
给定unique_ptr u_ptr,创建共享_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
以另一种方式不切实际。
(正如许多人所指出的那样,这个故事还有更多,值得阅读评论。)
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 如何使用非类型参数传递模板化类的 Ref 或 Ptr
- 从虚拟成员函数ptr中进行类型推导(bug?)
- (ptr语言 - A[0]) / (sizeof(A[0]) / sizeof(A[0][0]))的类型是什么?< /
- 将派生类的ptr类型转换为ptr类型