如何理解右值引用不能绑定一个右值引用类型的变量上?

菜鸡的逆袭之路 2016-12-03 11:10:12
下一段内容出自《c++ primer第五版 中文版》p471
变量可以看作只有一个运算对象而没有运算符的表达式,虽然我们很少这样看待变量。类似其他任何表达式,变量表达式也有左值/右值属性。变量表达式都是左值。带来的结果就是,我们不能将一个右值引用绑定到一个右值引用类型的变量,这有些令人惊讶。
如何理解红色的句子?为什么由上一句话可以得出这个结论?请举例说明,谢谢。
...全文
403 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
王标标 2018-11-01
  • 打赏
  • 举报
回复
变量是一种表达式,不管它是什么变量,类型都是左值,故不能绑定到右值引用
持地 2018-10-24
  • 打赏
  • 举报
回复
引用 7 楼 weixin_43503638 的回复:
int &&a = 1;//a是右值引用
a=2;//a是左值
int &&b=a;//错误 ,不能绑定右值引用到左值
int c=a;//ok


右值引用只能绑定到右值,而右值引用本身是左值。
持地 2018-10-24
  • 打赏
  • 举报
回复
int &&a = 1;//a是右值引用
a=2;//a是左值
int &&b=a;//错误 ,不能绑定右值引用到左值
int c=a;//ok
paschen 版主 2016-12-04
  • 打赏
  • 举报
回复
原因3楼已经说了,举例的话: int fun1(int&& a) { } int fun2(int&& a) { fun1(a); } fun2中的调用就是错的
fefe82 2016-12-04
  • 打赏
  • 举报
回复
左值右值用来描述表达式的,不是用来描述变量的。 右值引用的右值表示它可以绑定到一个结果为右值的表达式的结果,但并不表示变量本身作为表达式使用是为右值。
ri_aje 2016-12-04
  • 打赏
  • 举报
回复
1. 右值引用只能绑定到右值上,并且 2. 任何变量同时都是变量表达式,都是左值
xskxzr 2016-12-04
  • 打赏
  • 举报
回复
1、变量(variable)和表达式(expression)是两个不同的概念。 2、变量有一个属性:类型(Type),表达式有两个属性:类型和种类(Category)。 3、书上提到的变量表达式是一类特殊的表达式,从语法上看它就是这个变量的标识符(identifier)。 比如4楼的例子中fun1(a)是一个表达式,其中a是这个表达式的一个子表达式,它是一个变量表达式,指涉a这个标识符代表的变量。 4、变量表达式的类型是相应变量的类型,种类是左值(lvalue)。 接上面的例子,a这个表达式的类型是int&&,种类是左值。(没错,一个表达式可以在具有右值引用类型的同时是左值。) 5、一个引用类型的变量在定义时需要一个初始化表达式,即书上说的将这个引用绑定到这个表达式(书上说绑定到变量,其实更严格地说法是绑定到这个变量表达式)。右值引用类型通常不能绑定到左值(有些特殊情况由于太复杂这里就不讨论了)。 接上面的例子,调用fun1时需要初始化int&&类型的形参(parameter),但用作初始化的实参(argument)表达式a是左值,所以不行。 6、(题外话)表达式如果初始具有引用类型,在之后的分析中会被调整为相应的非引用类型。 接上面的例子,a尽管初始具有int&&类型,但在形参初始化过程的分析中,实参表达式a会先被调整为int类型,然后再进行分析。
ID870177103 2016-12-03
  • 打赏
  • 举报
回复
应该是说不存在引用的引用的意思吧,因为引用除了初始化就相当于它引用的变量,但不知道它为什么特指右值

64,662

社区成员

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

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