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. mysql 内存表

    show variables like 'max_%'; max_heap_table_size 16777216     max_tmp_tables 32     show variables l ...

  2. springboot 表单校验

    实体: @Entity public class User implements Serializable { /** * 编号 */ @Id @GeneratedValue private Long ...

  3. [Android Pro] 开发一流的 Android SDK:Fabric SDK 的创建经验

    cp from : https://academy.realm.io/cn/posts/oredev-ty-smith-building-android-sdks-fabric/ Ty Smith T ...

  4. linux下性能分析命令[总结]

    1.前言 在linux下开发程序,为了追求高性能,经常需要测试程序的性能,包括cpu.内存.io.网络等等使用情况.liunx下提供了众多命令方便查看各种资源的使用情况.经常用的有ps.top.fre ...

  5. telnet 163发送邮件

    1.telnet smtp.163.com 25 2. 3.测试成功

  6. Hadoop:开发机运行spark程序,抛出异常:ERROR Shell: Failed to locate the winutils binary in the hadoop binary path

    问题: windows开发机运行spark程序,抛出异常:ERROR Shell: Failed to locate the winutils binary in the hadoop binary ...

  7. MFC对话框:模态对话框及其弹出过程

    From: http://www.jizhuomi.com/school/c/160.html 加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有些了解了,有个好的开始对于以后的学习大有裨 ...

  8. oauth2-server-php-docs 授权控制器

    授权控制器 概观 对于授权端点,要求用户使用authorization code(授权码授权类型)或access token(隐式授权类型)对客户端进行认证和重定向. 方法 handleAuthori ...

  9. IC卡制作常识概述

    ic卡主要有9种:    1.接触型IC卡:    2.非接触型IC卡:    3.串行传输型IC卡:    4.并行传输型IC卡:    5.存储型IC卡:    6.智能型IC卡:    7.超级 ...

  10. java语言特性之一

    package java.util.Collections; public static int indexOfSubList(List<?> source, List<?> ...