【问题标题】:Is it possible to downcast shared_ptr without copy?是否可以在没有副本的情况下向下转换 shared_ptr ?
【发布时间】:2013-05-16 01:57:29
【问题描述】:
#include <memory>

struct a {};
struct b : public a {};

std::shared_ptr<b> get()
{
    std::shared_ptr<a> temp(new b);
    return std::static_pointer_cast<b>(temp); // atomic ref-count inc/dec
}

据我所知,向下转换 shared_ptr 的唯一方法是 static_pointer_cast。但是,它只需要 const 引用并创建参数的向下转换副本。如果可能的话,我想避免复制,因为 shared_ptr 的复制构造和销毁意味着原子递增/递减操作。

有些移动构造函数采用其他 shared_ptr 实例,但它们不支持向下转换。

是否可以以符合标准的方式避免复制?

【问题讨论】:

    标签: c++ c++11 shared-ptr downcast


    【解决方案1】:

    不,没有办法避免复制。

    这是因为std::shared_ptr&lt;a&gt;std::shared_ptr&lt;b&gt;之间没有继承关系,所以不能随意转换。

    如果您想获得(通过移动)传递给构造函数的指针的所有权,为什么不改用unique_ptr?如果您拥有所有权,则根本不要将其作为智能指针传递。

    【讨论】:

    • 它是多个线程之间共享的实体,所以我不能轻易将其转换为unique_ptr。
    猜你喜欢
    • 2022-09-26
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2021-09-09
    • 2014-06-16
    • 2018-01-03
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多