I got compile error when passing shared_ptr<Derived>& as shared_ptr<Base>&, see the below code and detailed question.
Note: this question is similar to "Passing shared_ptr<Derived> as shared_ptr<Base>" but not duplicate.
#include <memory> class TBase { public: virtual ~TBase() {} }; class TDerived : public TBase { public: virtual ~TDerived() {} }; void FooRef(std::shared_ptr<TBase>& b) { // Do something } void FooConstRef(const std::shared_ptr<TBase>& b) { // Do something } void FooSharePtr(std::shared_ptr<TBase> b) { // Do something } int main() { std::shared_ptr<TDerived> d; FooRef(d); // *1 Error: invalid initialization of reference of type ‘std::shared_ptr<TBase>&’ from expression of type ‘std::shared_ptr<TDerived>’ FooConstRef(d); // *2 OK, just pass by const reference FooSharePtr(d); // *3 OK, construct a new shared_ptr<> return 0; } Compiled by g++ -std=c++11 -o shared_ptr_pass_by_ref shared_ptr_pass_by_ref.cpp
Env: Ubuntu 14.04, g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Detailed question: Why is it OK to pass by const reference (*2), but not OK to pass by reference (*1)?
Note: I know the best practice is to pass by const reference, but just want to know why the compile error occurs.
FooRefdoesb.reset(new TBase)? If the call were possible, you would end up withstd::shared_ptr<TDerived>holding aTBase*. By the way, I suspect thatFooConstRefcall constructs a temporary that then binds to const reference; but temporaries can't bind to non-const ref.