• 什么是对象?
    An object is "something in memory".

  • 什么是左值,什么是右值?
    An lvalue expression identifies a non-temporary object.
    An rvalue expression identifies a temporary object or a value associated with no object.
    As a general rule, if you have a name for a variable, it is an lvalue.
    An l-value expression refers to an object's identity, whereas a r-value expression refers to an object's value.
    左值标识对象的身份,右值标识对象的值。

  • 常见的左值有“变量名”,常见的右值有“字面量”或者“变量经std::move转换的结果”。

  • 引用:A reference allows us to define a new name for an existing value. 既然是新名,而不是新对象,那么无论是左值还是右值引用,它们的作用都是避免拷贝,典型应用场景有传参和返回值,range for loops。两者的区别在于,右值引用所绑定对象是被原主人抛弃了的,允许被偷走。而左值引用不可以。

  • C++11增加了对右值引用的支持,右值引用是干什么的呢?

    从字面意思理解,右值引用当然是用来标识一个右值的身份了,通过它可以找到绑定的右值,方便对右值的读写。

    在没有右值引用之前,没有办法用变量标识一个右值,右值只可能短暂地存在,不可能被二次访问。更不要说跨函数地传递了(传参和返回值)。有了右值引用类型之后,这一切将变成可能。

  • std::move函数的作用是把一个左值转变成右值返回。

    如果返回的右值被用作了move操作(move constructor / assignment)的参数,那么原来的左值x所占有的资源已经被别的对象偷走,后面再对x操作时要明白,x的一部分资源已经不可靠了。

    如果x是stl定义的类型,stl向我们保证x的赋值和析构操作是可以正常执行的,

    如果x是我们自定义的类型,应该注意,move constructor / assignment操作应该保证跳出函数后x可以正常被析构。

  • 谁和谁可以绑定到一起?

int i = 10;
// 右值引用-右值
int&& rr = 42;
int&& rr1 = std::move(i);
//const左值引用--右值
const int& c = 42;
//左值引用--左值
int& lr = rr;
//注意:右值引用也是变量,所以rr是左值。
  • 右值引用常见用法

    1.如果把左值引用理解为变量的别名,那么右值引用就是资源的别名。通过右值引用可以直接操作藏在对象名后面的对象资源。

    string a = "aaa";string&& r = std::move(a);r = "rrr";cout << a << endl;/*output:rrr*/

2.作为move constructor 和 move assignment的参数。

    string a("aaa");string b(std::move(a));cout << "move construct b from a, a:" << a << "\tb:" << b << endl;string c("ccc");c = std::move(b);cout << "move assignment c from b, b:" << b << "\tc:" << c << endl;//可见,string的拷贝赋值里,对b和c的资源指针做了swap

转载于:https://www.cnblogs.com/meixiaogua/p/9924623.html

C++11新特性之右值引用相关推荐

  1. C++11 移动语义与右值引用

    1.移动语义 C++11 新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力.如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升程序性能.参考如下程序: ...

  2. C++11新特性之左值右值及移动语句与完美转发

    C左值右值 左值和右值的由来 什么是左值和右值 左值右值的本质 引用 左值引用 右值引用 移动语句与完美转发 移动语句 实现移动构造函数和转移赋值函数 stdmove 完美转发Perfect Forw ...

  3. C++11特性《 右值引用-<完美转发>、lambda表达式》

    1.右值引用 1.1移动语义 如果一个类中涉及到资源管理,用户必须显式提供拷贝构造.赋值运算符重载以及析构函数,否则编译器将 会自动生成一个默认的,如果遇到拷贝对象或者对象之间相互赋值,就会出错,比如 ...

  4. C++11 标准新特性: 右值引用与转移语义

    原文地址 http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新 ...

  5. 【转】C++11 标准新特性: 右值引用与转移语义

    VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...

  6. C++11新特性(一)右值引用

    @ 一.C++11简介 在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称.不过由于TC1主要是对C+ ...

  7. C++/C++11中左值、左值引用、右值、右值引用的使用

    C++的表达式要不然是右值(rvalue),要不然就是左值(lvalue).这两个名词是从C语言继承过来的,原本是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能. 在C++语言中,二者的区别就没 ...

  8. [C++11] 右值引用和移动语义

    c++11引入了右值引用和移动语义,通过避免无谓的复制,以提高程序的执行效率. 1.左值与右值 c++中的数值必属于左值或右值之一,通常有以下方法进行区分: 左值:在赋值语句左侧,右值:在赋值语句右侧 ...

  9. C++11右值引用、移动语义、完美转发详解

    c++中引入了右值引用和移动语义,可以避免无谓的复制,提高程序性能.有点难理解,于是花时间整理一下自己的理解. 左值.右值 C++中所有的值都必然属于左值.右值二者之一.左值是指表达式结束后依然存在的 ...

最新文章

  1. Linux普通用户启动tomcat
  2. 室外电磁赛道铺设补充说明
  3. 如何用12864液晶显示图片和绘制任意函数图象(打点)
  4. 【POJ3126 Prime Path】【POJ 3087 Shuffle'm Up】【UVA 11624 Fire!】【POJ 3984 迷宫问题】
  5. P4756-Added Sequence【斜率优化】
  6. mysql 主键 最佳实践_Spring Data Jpa + MySQL IDENTITY 主键下批量插入最佳实践
  7. matlab里用fix函数,Matlab基本函数-fix函数
  8. 广联达2018模板算量步骤_广联达钢结构算量软件可以和广联达量筋合一GTJ2018互导吗?...
  9. R语言acres92 region_[R语言 学习笔记] circlize绘制基因组圈图的原理与使用(一)...
  10. linux远程控制本地用户登录,linux 本地无法登录 远程可以登陆的解决办法
  11. AVS2 有点令人不敢相信
  12. 笔试面试题:25匹赛马,5个跑道,每次有5匹马可以同时比赛。问最少比赛多少次可以知道跑得最快的5匹马
  13. 【转】强烈推荐几个新鲜、好玩、另类的小游戏
  14. 电脑如何连接无线打印服务器,电脑怎么联接无线路由器打印机
  15. Ps 的模板文件格式 PSDT
  16. wordpress改作cms备忘
  17. 华为云磁盘挂载与分区扩容
  18. 01.【入门必备】认识python-->Linux中python环境搭建-->Linux交互模式ipython
  19. Inception模块
  20. Failed to build custom metric java.lang.NumberFormatException: For input string: “∞“

热门文章

  1. Installation error: INSTALL_FAILED_NO_MATCHING_ABIS
  2. ASP.NET 使用Ajax
  3. dos批处理命令详解(转)
  4. DLL型后门原理及完全清除秘诀
  5. datetime 索引_【免费毕设】ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现(源代码+论文)...
  6. Python机器学习:多项式回归与模型泛化004为什么需要训练数据集和测试数据集
  7. 最大期望算法 (EM算法)
  8. java登陆挤下去代码_application作用域实现用户登录挤掉之前登录用户代码
  9. 装Oracle10时报错,win10系统安装oracle10g时出现未知错误的详细教程
  10. python英文词频统计去除定冠词_使用Python进行英文词频统计