成员函数右值引用限定符与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); }
...全文
193 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() &
这个函数。 我的理解有错吗?
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1   1.1 编写一个简单的C++程序 2   1.1.1 编译、运行程序 3   1.2 初识输入输出 5   1.3 注释简介 8   1.4 控制流 10   1.4.1 while语句 10   1.4.2 for语句 11   1.4.3 读取数量不定的输入数据 13   1.4.4 if语句 15   1.5 类简介 17   1.5.1 Sales_item类 17   1.5.2 初识成员函数 20   1.6 书店程序 21   小结 23   术语表 23   第Ⅰ部分 C++基础 27   第2章 变量和基本类型 29   2.1 基本内置类型 30   2.1.1 算术类型 30   2.1.2 类型转换 32   2.1.3 字面值常量 35   2.2 变量 38   2.2.1 变量定义 38   2.2.2 变量声明和定义的关系 41   2.2.3 标识符 42   2.2.4 名字的作用域 43   2.3 复合类型 45   2.3.1 引用 45   2.3.2 指针 47   2.3.3 理解复合类型的声明 51   2.4 const限定符 53   2.4.1 const的引用 54   2.4.2 指针和const 56   2.4.3 顶层const 57   2.4.4 constexpr和常量表达式 58   2.5 处理类型 60   2.5.1 类型别名 60   2.5.2 auto类型说明符 61   2.5.3 decltype类型指示符 62   2.6 自定义数据结构 64   2.6.1 定义Sales_data类型 64   2.6.2 使用Sales_data类 66   2.6.3 编写自己的头文件 67   小结 69   术语表 69   第3章 字符串、向量和数组 73   3.1 命名空间的using声明 74   3.2 标准库类型string 75   3.2.1 定义和初始化string对象 76   3.2.2 string对象上的操作 77   3.2.3 处理string对象中的字符 81   3.3 标准库类型vector 86   3.3.1 定义和初始化vector对象 87   3.3.2 向vector对象中添加元素 90   3.3.3 其他vector操作 91   3.4 迭代器介绍 95   3.4.1 使用迭代器 95   3.4.2 迭代器运算 99   3.5 数组 101   3.5.1 定义和初始化内置数组 101   3.5.2 访问数组元素 103   3.5.3 指针和数组 105   3.5.4 C风格字符串 109   3.5.5 与旧代码的接口 111   3.6 多维数组 112   小结 117   术语表 117   第4章 表达式 119   4.1 基础 120   4.1.1 基本概念 120   4.1.2 优先级与结合律 121   4.1.3 求值顺序 123   4.2 算术运算符 124   4.3 逻辑和关系运算符 126   4.4 赋值运算符 129   4.5 递增和递减运算符 131   4.6 成员访问运算符 133   4.7 条件运算符 134   4.8 位运算符 135   4.9 sizeof运算符 139   4.10 逗号运算符 140   4.11 类型转换 141   4.11.1 算术转换 142   4.11.2 其他隐式类型转换 143   4.11.3 显式转换 144   4.12 运算符优先级表 147   小结 149   术语表 149   第5章 语句 153   5.1 简单语句 154   5.2 语句作用域 155   5.3 条件语句 156   5.3.1 if语句 156   5.3.2 switch语句 159   5.4 迭代语句 165   5.4.1 while语句 165   5.4.2 传统的for语句 166   5.4.3 范围for语句 168   5.4.4 do while语句 169   5.5 跳转语句 170   5.5.1 break

65,210

社区成员

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

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