标准::static_pointer_cast vs static_cast<标准::shared_ptr<A>>

std::static_pointer_cast vs static_cast<std::shared_ptr<A>>

本文关键字:lt 标准 cast static gt ptr vs pointer shared      更新时间:2023-10-16

我有一个类层次结构,其中B是从A派生而来的,如下所示:

class A : public std::enable_shared_from_this<A>
{
};
class B : public A
{
   void f()
   {
        // the code below compiles
        std::shared_ptr<B> copyOfThis = std::static_pointer_cast<B>(shared_from_this()); 
        // the code below does not
        std::shared_ptr<B> copyOfThis = static_cast<std::shared_ptr<B>>(std::make_shared<A>(shared_from_this()));
}
};

所以实际上我想理解为什么我不能使用static_cast将父类的shared_ptr强制转换为子类,而它实际上包含子类的this

编辑:看看这个问题:多态智能指针的使用这里我问了为什么子的共享指针可以投射到父的共享指针上。答案是有一个模板构造函数。请参阅问题中的详细信息。那么,为什么即使shared_ptr<A>shared_ptr<B>之间没有关系,这个构造函数也无助于强制转换呢。

不能将shared_ptr<A>强制转换为shared_ptr<B>,因为类型之间没有继承关系。出于同样的原因,您不能将vector<A>强制转换为vector<B>

用相关类型实例化类模板不会使模板实例化也相关。

shared_ptr<T>(const shared_ptr<Y>&)构造函数没有帮助,因为它只有在Y*隐式转换为T*时才可用,即它支持隐式发生的相同指针转换,如B*A*而不是A*B*

可以做的是:

shared_ptr<A> thisA = shared_from_this();
shared_ptr<B> thisB(thisA, static_cast<B*>(thisA.get()));

这将创建一个shared_ptr<B>thisA共享所有权,并保存指针static_cast<B*>(thisA.get())

这正是static_pointer_cast<B>(thisA)所做的,但上面使用的别名构造函数是后来添加到shared_ptr中的,所以在static_pointer_cast发明时并不存在,它在做什么也不太清楚。CCD_ 25表现力更强。如果要对指针类型执行静态强制转换,请使用static_pointer_cast

长话短说:std::shared_ptr<A>而不是std::shared_ptr<B>的父级。这就是CCD_ 29存在的全部意义。