引用限定符与std::move()的问题

class Quote{
public:
    Quote(const Quote& q) : bookNo(q.bookNo), price(q.price) {}
    Quote(Quote&& q) noexcept : bookNo(std::move(q.bookNo)), price(std::move(q.price)) {}
    
    virtual Quote* clone() const & { return new Quote(*this); }
    virtual Quote* clone() && {return new Quote(std::move(*this));}
    //这里用std::move的用意是什么?是为了显式调用Quote(Quote&& q)这个构造函数吗?我原以为直接virtual Quote* clone() && {return new Quote(*this);}就行了,因为有&&引用限定符,说明*this是右值。我说错没?

private:
    std::string bookNo;

protected:
    double  price = 10.0;
};
阅读 3.6k
2 个回答

尽管virtual Quote* clone() &&的参数本来是右值,但因为*this这个操作使之变成了左值,所以还需要move()操作将之变为右值

没错. 我特意还去看了一下标准文档, 发现果然有这种写法.

Quote* q = Quote().clone();

这行代码就会调用你那个clone() &&的重载函数, 因为*this是一个右值对象.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进