当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《std::static_pointer_castvsstatic_cast<std::shared_ptr<A>>》经验,为你挑选了2个好方法。

我有一个类层次结构,其中B派生自A这样:

class A : public std::enable_shared_from_this
{

};

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

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

编辑:看看这个问题:多态智能指针的使用在这里我已经问过为什么子的共享指针可以在父级的共享指针上进行转换.答案是有一个模板构造函数.查看问题中的详细信息.那么为什么这个构造函数无法帮助进行转换,即使shared_ptr和之间没有任何关系shared_ptr.



1> Jonathan Wak..:

您无法转换shared_ptrshared_ptr因为类型之间没有继承关系.出于同样的原因,你可以不投vectorvector.

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

shared_ptr(const shared_ptr&)构造函数没有帮助,因为它是如果只使用Y*隐式转换为T*,也就是说,它是有支持相同的指针转换为将隐含发生,就像B*A*,不能 A*B*.

可以做到这一点:

shared_ptr thisA = shared_from_this();
shared_ptr thisB(thisA, static_cast(thisA.get()));

这将创建一个shared_ptr共享所有权thisA,并保持指针static_cast(thisA.get())

这正是static_pointer_cast(thisA)如此,但上面使用的别名构造函数被添加到shared_ptr以后,因此在static_pointer_cast发明时不存在,并且它不太清楚它在做什么.static_pointer_cast更具表现力.如果要对指针类型执行静态强制转换,请使用static_pointer_cast.



2> Jean-Bernard..:

长话短说:std::shared_ptr不是的父母std::shared_ptr.这就是static_pointer_cast存在的全部观点.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有