#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
}
据我所知,downcast shared_ptr的唯一方法是static_pointer_cast。但是,它只需要const引用并创建参数的下载副本。如果可能的话,我想避免复制,因为复制构造和shared_ptr的破坏意味着原子递增/递减操作。
有一些移动构造函数采用shared_ptr的其他实例,但它们不支持向下转换。
是否可以避免以符合标准的方式进行复制?
答案 0 :(得分:5)
不,没有办法避开副本。
这是因为std::shared_ptr<a>
和std::shared_ptr<b>
之间没有继承关系,因此您无法在它们之间任意转换。
如果要获取传递给构造函数的指针的所有权(通过移动),为什么不使用unique_ptr
呢?如果您没有取得所有权,请不要将其作为智能指针传递。