我曾与之合作的人曾说过,shared_ptr是不安全的,并且会在从派生类转换为基类时进行切片(即向上转换).例如,如果有两个A和B类,其中B来自A,那么
shared_ptr<A> a(new B)
Run Code Online (Sandbox Code Playgroud)
会切片.我指着他http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/shared_ptr.htm 在那里说
shared_ptr<T>可以隐式转换到shared_ptr<U>每当T*可以隐式转换到U*.
暗示在这些情况下使用是安全的,但他似乎并不这么认为.
Geo*_*che 12
有人错了,对象切片不适用于指针.指针用法被包含在一个中shared_ptr并没有改变它 - 它在这里没有做任何特殊的魔法,它用传递给它的构造函数的值初始化一个内部指针.
为了这个问题,简化它可能看起来像这样:
template<class T> struct ptr {
T* t;
ptr(T* t) : t(t) {}
// ...
};
Run Code Online (Sandbox Code Playgroud)
你丢失了静态类型信息B,是的,但是对于指向的对象没有任何变化.