C++多态与boost scoped_ptr

ATe*_*emp 3 c++ polymorphism boost scoped-ptr

为什么以下代码不允许调用foo(ptr)?

#include <boost/scoped_ptr.hpp>
struct A {
    virtual ~A() {}
};

struct B: public A {};

void foo(boost::scoped_ptr<A>& a) {}

void goo(A& a) {}
int main() {
    boost::scoped_ptr<B> ptr(new B);
    foo(ptr);
    B b;
    goo(b);
}
Run Code Online (Sandbox Code Playgroud)

我们传递引用的相应表单按预期工作.我们不应该使用boost scoped_ptr做多态吗?

g ++ with boost 1.49给了我:

error: invalid initialization of reference of type ‘boost::scoped_ptr<A>&’ from expression of type ‘boost::scoped_ptr<B>’
Run Code Online (Sandbox Code Playgroud)

Arm*_*yan 5

这是因为foo,出于某种原因,通过引用获取范围指针.这完全没必要,也就是呼叫失败的原因.有从转换scoped_ptr<B>scoped_ptr<A>但不能从scoped_ptr<B>&scoped_ptr<A>&.

你应该将它作为const的引用传递给它.

void foo(boost::scoped_ptr<A> const & a) {}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这不是智能指针本身的"问题".以下代码失败的原因与您的相同.

void foo(A*& p) {}
int main()
{
    B* p = new B;
    foo(p); //FAIL
}
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,你必须通过值传递指针,或者,如果你已经足够变态,通过引用const

 void foo (A * const & p); // <-- a perv wrote this
Run Code Online (Sandbox Code Playgroud)