2
#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 的其他实例,但它们不支持向下转换。

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

4

1 回答 1

5

不,没有办法避免复制。

std::shared_ptr<a>这是因为和之间没有继承关系std::shared_ptr<b>,所以不能在它们之间随意转换。

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

于 2013-05-16T02:26:04.117 回答