使用这种智能指针强制转换是否安全?
Is it safe to use such smart pointer casting?
使用这种智能指针强制转换安全吗?
APtr a(new A());
BPtr & b = (Bptr&)a; // this is it
,
class A
{
public:
virtual ~A(){}
virtual void methodA() = 0;
}
typedef std::tr1::shared_ptr<A> APtr;
class B : public A
{
public:
virtual ~B(){}
virtual void methodB() = 0;
}
typedef std::tr1::shared_ptr<B> BPtr;
/////////////////////////////////////////////////////////////////////////////////
BPtr & b = a; //this way doesn't work
要向下转换智能指针,应该使用xxxx_pointer_cast函数,例如静态强制转换
BPtr b = std::tr1::static_pointer_cast<B>(a);
或动态强制转换
BPtr b = std::tr1::dynamic_pointer_cast<B>(a);
是否安全是另一个问题。这绝对是不寻常的,也不太可能给其他类型的引用分配一个智能指针,同时也强行尝试使它成为一个哑指针。
我认为你需要先弄清楚这些类型是什么。然后。好吧,如果你以后还坚持要问的话,答案很可能是"不"。
EDIT:修改这个答案(因为它又被挖出来了,已经过去很久了)。
类A
和B
可能有继承关系,但shared_ptr<A>
和shared_ptr<B>
没有。shared_ptr
是一个模板类,A
的模板实例化与B
的实例化没有关系。
使用类似c的类型转换(或reinterpret_cast
)工作,但只是因为你正在强制重新解释底层位。两个不同shared_ptr
实例上的dynamic_cast
将失败,因为您没有强制转换继承的指针,而是试图强制转换完全不同且不兼容类型的智能指针。
对于你提出的问题,答案(仍然)是否定的。
相关文章:
- 是否可以从int转换为enum类类型
- 隐式转换是否应该在模板参数的上下文中工作?
- C++ stod:字符串到浮点转换是否一致
- 自动(toCast)显式转换是否计划在未来C++标准?
- 类类型的左值到右值转换:是否涉及复制?
- 矢量之间的转换是否定义了行为
- 如何检测 W2A 转换是否完全成功
- interpret_cast和c样式强制转换是否兼容(按照c++标准)
- 仅更改常量性的指针强制转换是否可以调用未定义的行为
- C++ 强制转换是否会创建新对象
- 在类树中使用动态强制转换是否可以接受
- 在C++中的函数调用内部执行强制转换时,强制转换是否真的有效
- 检查显式强制转换是否成功
- 如果派生类只包含方法(没有成员变量),向下强制转换是否安全?
- 使用这种智能指针强制转换是否安全?
- 类型转换是否消耗额外的CPU周期?
- 在void*和void*之间进行强制转换时,混合使用静态强制转换和重新解释强制转换是否不安全?
- 类型转换是否在内部使用条件?(C / c++, c#)
- 如何检测转换是否在 c++0x 中失败
- 如何在CRTP中实现向下转换是否有效的编译时检查