为什么它需要一个右值复制构造函数,即使它不会被调用?

Why it needs a rvalue copy constructor even it won't be called?

我写了一个shared_ptr class定义如下:

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);

它不会工作,编译器会给我这样的错误

non-const lvalue reference to type shared_ptr<> cannot bind to rvalue of type shared_ptr<>

我添加了一个右值复制构造函数:

template <typename T>
shared_ptr(shared_ptr&& src) {
  print("rvalue");
}

但是没有语句打印出来。

我的环境是 visual studio 2019,使用 MSVC++。

如果我的右值拷贝构造函数没有执行,为什么在没有右值拷贝构造函数的情况下会出错? (我猜这是一个 RVO,但似乎不是)

谢谢大家的回答和评论,下次我会学着回答好问题的。

问题是您的复制构造函数出于某种原因接受非const 左值引用,它不能绑定到右值。只需将其设为 const:

shared_ptr(shared_ptr const& src) noexcept;

并且不需要移动构造函数。然而,无论如何实施移动 constructor/assignment 是个好主意,不要毫无意义地扰动参考计数器。