lvalue & rvalue
https://www.youtube.com/watch?v=UTUdhjzws5g
链接:https://www.zhihu.com/question/50652989/answer/312543073
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
str5被std::move
之后,只是返回了一个它的右值引用。
std::move(str5)
等价于
static_cast<std::string&&>(str5)
如果不去使用这个返回值去触发一下移动的操作,比如用于调用移动构造函数,或者接收右值引用参数的函数,那么原对象是没有任何变化的。
再者,即使进行了这些操作,后续对被move的对象操作也未必一定是undefined的
比如对于STL容器来说,move之后的赋值运算符、clear()都是安全的,但size() push()的行为就是undefined
1.
你的代码中,move()将str5转换成了一个右值引用返回,然后只是又定义了有名字的右值引用rr5并绑定上去。没有触发移动构造函数,因此原对象仍然有效。如果改成std::string rr5 = std::move(str5);
就会触发移动构造函数,因为这是在构造一个新对象,而不是定义一个已有对象的新引用。
2.
由1.可知,str5其实没有改变,而lr5和rr5都是str5的引用(区别只是类型,一个左值引用,一个是右值引用)。他们三个其实指向了同一块空间。因此对他们的更改其实都是对同一个对象的更改。
另外值得注意的一点,右值应该是不能被赋值的,然而为何能够对右值引用类型的rr5赋值? rr5[0] = 'b'
根据左值规定之一:变量、函数或数据成员之名,不论其类型,即使变量的类型是右值引用,由其名字构成的表达式仍是左值表达式。
因此尽管rr5的类型是右值引用,表达式rr5求值时,会转换成左值引用。
lvalue & rvalue的更多相关文章
- Lvalue, Rvalue, Xvalue, Prvalue, Glvalue
c++11中关于什么是lvalue, 什么是rvalue, 什么是xvalue, 什么是prvalue, 什么是… 一直搞得我晕头转向的, 今天下定决心一定要把它搞定, 写了一个程序来判断lvalue ...
- 理解lvalue和rvalue
今天看C++模板的资料,里面说到lvalue,rvalue的问题,这个问题以前也看到过,也查过相关资料,但是没有考虑得很深,只知道rvalue不能取地址,不能赋值等等一些规则.今天则突然有了更深层次的 ...
- C++11引用临时变量的终极解析
工作中遇到一个引用临时变量的问题,经过两天的学习,私以为:不仅弄明白了这个问题,还有些自己的独到见解. 这里使用一个简单的例子来把自己的学习过程和理解献给大家,如果有什么问题请不吝指正. **** ...
- C++ 之 const references
extraction from The C++ Programming Language 4th. ed., Section 7.7 References, Bjarne Stroustrup To ...
- move和转发
总的来说C++09跟C++98相比的变化是极其重大的.这个变化体现在三个方面,一个是形式上的变化,即在编码形式层面的支持,也就是对应我们所谓的编程范式(paradigm).C++09不会引入新的编程范 ...
- 现代程序设计 homework-07
现代程序设计 homework-07 这次作业是要阅读C++11的新特性,按照老师blog提供的链接稍微学习了一下,一下就是一些学习总结(或者说就是介绍)之类的:由于英文能力有限,并且很多中文资料也都 ...
- “Clang” CFE Internals Manual---中文版---"Clang"C语言前端内部手册
原文地址:http://clang.llvm.org/docs/InternalsManual.html 译者:史宁宁(snsn1984) "Clang"C语言前端内部手册 简介 ...
- 分享python分析wave, pcm音频文件
最近研究的,我用的是python3.3, 用matplotlib画图, 下面代码演示分析pcm文件,如果是wave文件,把wave的文件头去掉就是pcm文件了. 代码如下 # -*- coding:u ...
- 常见RPC开源框架
什么是rpc框架先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用?通常我们调用一个php中的方法,比如这样 ...
随机推荐
- Javascript 对象(object)合并
对象的合并 需求:设有对象 o1 ,o2,需要得到对象 o3 var o1 = { a:'a' }, o2 = { b:'b' }; // 则 var o3 = { a:'a', b:'b' } 方法 ...
- cross validation笔记
preface:做实验少不了交叉验证,平时常用from sklearn.cross_validation import train_test_split,用train_test_split()函数将数 ...
- window.parent window.top window.parent.location.pathname 没权限
跨域问题啊,如果只是测试的话,放到服务器去测试,本地的(http://localhost/)就算是在同一个文件下,都会被认为跨域的.如果不需要支持低版本IE浏览,可以使用postMessage处理这个 ...
- DatabaseMirroring搭建
1. 概述 数据库镜像维护一个数据库的两个副本,这两个副本必须驻留在不同的 SQL Server 数据库引擎 服务器实例上.通常,这些服务器实例驻留在不同位置的计算机上.启动数据库上的数据库镜像 ...
- [转]应用RSACryptoServiceProvider类轻松实现RSA算法
在我们现实当中经常会存在需要对某些数据进行加密保护 然后进行解密的操作,比方,我们需要对某些XML配置信息里面的某些数据进行加密,以防止任何人打开该XML配置信息都能正常的看到该配置信息里面的内容,从 ...
- FileStream 的FileShare一点小认识
C#读写文本文件一般都是用StreamWriter来实现(读书的时候就这样用,毕业后这几年基本也是这样干的),通常代码如下: using (StreamWriter sw = new StreamWr ...
- [leetcode]Rotate Image @ Python
原题地址:https://oj.leetcode.com/problems/rotate-image/ 题意: You are given an n x n 2D matrix representin ...
- 关于如何使用javascript监听滚动条滚动事件
在网页中,通常有一个通往网页顶部的锚点,现在我们就来实现它 Html代码: <a id="scrollup" href="#top" style=&quo ...
- Jquery的分页插件
Jquery的分页插件, 用起来还不错. 来自: http://flaviusmatis.github.io/simplePagination.js/ 下载地址: https://github.c ...
- Emeditor V14注册码
Emeditor V14注册码 姓 名:ttrar.com 序 列 号:DKAZQ-R9TYP-5SM2A-9Z8KD-3E2RK