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的更多相关文章

  1. Lvalue, Rvalue, Xvalue, Prvalue, Glvalue

    c++11中关于什么是lvalue, 什么是rvalue, 什么是xvalue, 什么是prvalue, 什么是… 一直搞得我晕头转向的, 今天下定决心一定要把它搞定, 写了一个程序来判断lvalue ...

  2. 理解lvalue和rvalue

    今天看C++模板的资料,里面说到lvalue,rvalue的问题,这个问题以前也看到过,也查过相关资料,但是没有考虑得很深,只知道rvalue不能取地址,不能赋值等等一些规则.今天则突然有了更深层次的 ...

  3. C++11引用临时变量的终极解析

    工作中遇到一个引用临时变量的问题,经过两天的学习,私以为:不仅弄明白了这个问题,还有些自己的独到见解. 这里使用一个简单的例子来把自己的学习过程和理解献给大家,如果有什么问题请不吝指正.   **** ...

  4. C++ 之 const references

    extraction from The C++ Programming Language 4th. ed., Section 7.7 References, Bjarne Stroustrup To ...

  5. move和转发

    总的来说C++09跟C++98相比的变化是极其重大的.这个变化体现在三个方面,一个是形式上的变化,即在编码形式层面的支持,也就是对应我们所谓的编程范式(paradigm).C++09不会引入新的编程范 ...

  6. 现代程序设计 homework-07

    现代程序设计 homework-07 这次作业是要阅读C++11的新特性,按照老师blog提供的链接稍微学习了一下,一下就是一些学习总结(或者说就是介绍)之类的:由于英文能力有限,并且很多中文资料也都 ...

  7. “Clang” CFE Internals Manual---中文版---"Clang"C语言前端内部手册

    原文地址:http://clang.llvm.org/docs/InternalsManual.html 译者:史宁宁(snsn1984) "Clang"C语言前端内部手册 简介 ...

  8. 分享python分析wave, pcm音频文件

    最近研究的,我用的是python3.3, 用matplotlib画图, 下面代码演示分析pcm文件,如果是wave文件,把wave的文件头去掉就是pcm文件了. 代码如下 # -*- coding:u ...

  9. 常见RPC开源框架

    什么是rpc框架先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用?通常我们调用一个php中的方法,比如这样 ...

随机推荐

  1. hex string 换转

    hex2string std::stringstream R; R << std::hex << 0x1254; DWORD Str2Hex(string str){ retu ...

  2. Leetcode刷题记录:计算复数乘法

    题目要求 计算两个复数的乘积. 参考题解 这道题感觉很简单,主要是对复数的表达式进行解析,然后套用公式,输出结果就可以了. class Solution: def complexNumberMulti ...

  3. 在 JDK 9 中更简洁使用 try-with-resources 语句

    本文详细介绍了自 JDK 7 引入的 try-with-resources 语句的原理和用法,以及介绍了 JDK 9 对 try-with-resources 的改进,使得用户可以更加方便.简洁的使用 ...

  4. jQuery事件命名空间多事件绑定自定义事件js 命名空间 javascript命名空间

    http://blog.csdn.net/pigpigpig4587/article/details/24727791 jQuery事件命名空间 jQuery支持事件命名空间,以方便事件管理.例如,在 ...

  5. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  6. 一致性哈希算法(consistent hashing)(转)

    原文链接:每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)  一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网 ...

  7. N体运动的程序模拟

    这依然是与<三体>有关的一篇文章.空间中三个星体在万有引力作用下的运动被称之为三体问题,参见我的上一篇文章:三体运动的程序模拟.而这一节,对三体问题进行了扩展,实现了空间中N个星体在万有引 ...

  8. FreePascal - Typhon在Windows10 X64下的使用问题!

    Typhon是CodeTyphon中的开发FreePascal的IDE工具. 在Windows10 X64中安装完CodeTyphon后,我们会发现有两套Typhon,分别对应32位和64位,32位可 ...

  9. 第二章 logstash - 输出插件之redis与es

    最常用的两个输出插件: redis es 一.redis 1.用法 output { redis{ batch => false batch_events => 50 batch_time ...

  10. HTML5基础扩展——地理位置、本地存储、缓存

    HTML5扩展,继上两篇博客,我们来看一下HTML5的一些扩展的功能,由于HTML5更多是为了兼容电脑浏览器,安卓浏览器,苹果浏览器更多浏览器,或者说为这些浏览器提供一个统一的标准.因此目前在手机上的 ...