更新:此示例中的shared_ptr类似于Boost中的shared_ptr,但它不支持shared_polymorphic_downcast(或者对于此问题,不支持dynamic_pointer_cast或static_pointer_cast)!
我正在尝试初始化指向派生类的共享指针,而不会丢失引用计数:
struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;
// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;
到目前为止,一切都很好。我没想到C ++会将Base *隐式转换为Derived *。但是,我确实想要代码表示的功能(即在向下转换基本指针的同时保持引用计数)。我的第一个想法是在Base中提供一个强制转换运算符,以便可以隐式转换为Derived(对于pedants:我会检查向下强制转换是否有效,不用担心):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
好吧,这没有帮助。看来编译器完全忽略了我的类型转换运算符。有什么想法可以使shared_ptr分配工作吗?需要特别说明的Base* const
是:哪种类型? const Base*
我了解,但是Base* const
?const
在这种情况下指的是什么?