【问题标题】:Why it needs a rvalue copy constructor even it won't be called?为什么它需要一个右值复制构造函数,即使它不会被调用?
【发布时间】:2021-11-01 19:25:39
【问题描述】:

我写了一个shared_ptr,类定义如下:

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

但没有打印出来。

我的环境是带有 MSVC++ 的 Visual Studio 2019。

如果我的右值拷贝构造函数没有被执行,为什么没有右值拷贝构造函数时会出错? (我猜它是 RVO 但似乎不是)

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

【问题讨论】:

  • @Enlico 确实很长,但我们不鼓励用户调试他们的代码吗?
  • RVO 部分可能与c++ - Why is a public copy constructor required even if it is not invoked? - Stack Overflow 重复,但我不确定复制/移动是否有显着差异。
  • @user202729,我们也应该鼓励“调试”散文。
  • @JunzhongPan - 不要道歉。虽然您的帖子本来可以更专注,但它的提出方式是不可原谅的。
  • @DaveNewton,下次我会温柔一点。

标签: c++ c++11 rvalue lvalue make-shared


【解决方案1】:

问题是您的复制构造函数由于某种原因接受了非const 左值引用,它不能绑定到右值。让它成为常量:

shared_ptr(shared_ptr const& src) noexcept;

并且不需要移动构造函数。然而,无论如何实现移动构造函数/赋值是个好主意,不要无意义地搅动引用计数器。

【讨论】:

    猜你喜欢
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2017-05-20
    • 2013-11-23
    • 2013-08-11
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多