成员函数右值引用限定符与std::move()的问题

agfav12 2015-11-24 11:20:23
书上例子是这样的:
virtual Quote* clone() && {return new Quote(std::move(*this));}

我想问的是:
既然有了&&限定符,说明*this本身就是右值,为何还要std::move(*this)呢?直接return new Quote(*this);不就行了嘛?难道是为了让人一目了然?
哦对了,书上前面说智能指针比指针好,那么这里为什么不用智能指针呢?

virtual shared_ptr<Quote> clone() const & { return make_shared<Quote>(*this); }
...全文
138 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
*this 是左值
paschen 版主 2015-11-25
  • 打赏
  • 举报
回复
引用 3 楼 agfav12 的回复:
[quote=引用 2 楼 paschen 的回复:] 你*this类型不是&&啊,不加会调用拷贝构造函数而不是移动 智能指针用于动态分配内存的指针,不用自己去释放内存
所以例子为何不用智能指针呢?[/quote] 也不一定非要用啊,简单的情况一般都用普通指针也行
agfav12 2015-11-25
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
你*this类型不是&&啊,不加会调用拷贝构造函数而不是移动 智能指针用于动态分配内存的指针,不用自己去释放内存
所以例子为何不用智能指针呢?
paschen 版主 2015-11-25
  • 打赏
  • 举报
回复
你*this类型不是&&啊,不加会调用拷贝构造函数而不是移动 智能指针用于动态分配内存的指针,不用自己去释放内存
fefe82 2015-11-25
  • 打赏
  • 举报
回复
在进行 overload resolution 时,类的非静态成员函数会增加一个形参(parameter),其类型为类类型的引用。 如果引用限定符(ref-qualifier)为&& ,则这是一个右值引用,否则为一个左值引用。 调用这个函数的类对象作为与增加的形参对应的实参(argument)。 如果没有引用限定符,那么增加的左值引用的形参可以绑定到一个 rvalue 上(即使它并非 const)。 ============================== ref-qualifier 只被用作 overload resolution ,this 和 ref-qualifier 并没有什么关系。
fefe82 2015-11-25
  • 打赏
  • 举报
回复
虽然加了 && 限定符,但是 this 的类型依然是 Quote * 。不存在指向引用的指针。 *this 的类型是 Quote 。而不是任何一种引用。
agfav12 2015-11-25
  • 打赏
  • 举报
回复
引用 1 楼 fefe82 的回复:
虽然加了 && 限定符,但是 this 的类型依然是 Quote * 。不存在指向引用的指针。 *this 的类型是 Quote 。而不是任何一种引用。
我看了下书,书上说引用限定符表示this指向的对象是左值还是右值,也就是说引用限定符和this指向的是不是引用毫无关系?
agfav12 2015-11-25
  • 打赏
  • 举报
回复
引用 1 楼 fefe82 的回复:
虽然加了 && 限定符,但是 this 的类型依然是 Quote * 。不存在指向引用的指针。 *this 的类型是 Quote 。而不是任何一种引用。
我看了下书,感觉搞混了。说下我的理解:
virtual Quote* clone() &&
这里的&&引用限定符,表示这个函数的对象本身是个右值,如果不是右值,则根本不会调用此函数,而是调用
virtual Quote* clone() &
这个函数。 我的理解有错吗?

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧