I've wrote a shared_ptr the class definition is as below:
template <typename T>
class shared_ptr {
private:
...
public:
shared_ptr(T* p);
shared_ptr(shared_ptr& src);
shared_ptr& operator=(shared_ptr const& src);
};
shared_ptr<T> make_shared(Args&&... args) {
return shared_ptr<T>(new T(std::forward<Args>(args)...));
}
// the function call:
shared_ptr<int> a = make_shared<int>(1);
it won't work and the compiler error me that
non-const lvalue reference to type shared_ptr<> cannot bind to rvalue of type shared_ptr<>
I add a rvalue copy constructor:
template <typename T>
shared_ptr(shared_ptr&& src) {
print("rvalue");
}
But no statement are printed out.
my environment is visual studio 2019 with MSVC .
if my rvalue copy constructor is not executed, why it errors when there is no rvalue copy constructor? (I guess it's a RVO but seems it's not)
thank you all for the answer and comment , I will learn to answer good question next time.
CodePudding user response:
The issue is that your copy constructor accepts a non-const
lvalue reference for some reason, which can't bind to an rvalue. Just make it const:
shared_ptr(shared_ptr const& src) noexcept;
and the move constructor won't be required. However it's a good idea to implement the move constructor/assignment anyway, to not pointlessly jerk the reference counter.