gpt4 book ai didi

c++ - std::static_pointer_cast 与 static_cast>

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:58 32 4
gpt4 key购买 nike

我有一个类层次结构,其中 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 child 的。

编辑:看看这个问题:Polymorphic smart pointer usage在这里我问了为什么可以将子共享指针强制转换为父共享指针。答案是有一个模板构造函数。请参阅问题中的详细信息。那么为什么即使 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 时不存在被发明了,而且它在做什么也不太清楚。 static_pointer_cast更具表现力。如果要对指针类型执行静态转换,请使用 static_pointer_cast .

关于c++ - std::static_pointer_cast 与 static_cast<std::shared_ptr<A>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34048692/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com