标准::static_pointer_cast vs static_cast<标准::shared_ptr<A>>
std::static_pointer_cast vs static_cast<std::shared_ptr<A>>
我有一个类层次结构,其中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存在的全部意义。
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 呼叫运营商<<临时
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- 标准是否严格定义了该程序应该如何编译?
- 如何从Windows应用程序输出到标准?
- 安全到标准:移动会员?
- 如何正确将字符串转换为标准::时间::system_clock::time_point?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- C++标准::cout和<<操作员,优先级