如果我删除const,为什么调用boost :: shared_ptr不能在c ++中编译?

g.-*_*-o. 2 c++ const temporary shared-ptr

#include <boost/smart_ptr.hpp>

class Base {
};

class Derived : public Base {
  public:
    Derived() : Base() {}
};

void func(/*const*/ boost::shared_ptr<Base>& obj) {
}

int main() {
  boost::shared_ptr<Base> b;
  boost::shared_ptr<Derived> d;
  func(b);
  func(d);
}
Run Code Online (Sandbox Code Playgroud)

这用func的签名中的const编译,但不是没有它.该错误出现在呼叫的行中func(d);

有什么提示吗?

Fil*_*efp 7

阅读文档时,boost::shared_ptr我们发现以下内容:

shared_ptr<T>可以隐式转换到shared_ptr<U>每当T*可以隐式转换到U*.


这意味着boost::shared_ptr<Derived>可以隐式转换为类型的对象boost::shared_ptr<Base>.

func (d)虽然非const引用不能绑定到临时对象,但在执行临时对象时会发生此转换,这就是为什么编译器发出错误的原因,除非你将参数设置为funca const&.