详解C++右值引用】的更多相关文章

C++0x标准出来很长时间了,引入了很多牛逼的特性[1].其中一个便是右值引用,Thomas Becker的文章[2]很全面的介绍了这个特性,读后有如醍醐灌顶,翻译在此以便深入理解. 目录 概述 move语义 右值引用 强制move语义 右值引用是右值吗? move语义与编译器优化 完美转发:问题 完美转发:解决方案 Rvalue References And Exceptions The Case of the Implicit Move Acknowledgments and Further…
C++11中的右值引用 May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移动语义std::move() 右值引用和右值的关系 完美转发 引用折叠推导规则 特殊模板参数推导规则 解决完美转发问题 引用 在C++98中有左值和右值的概念,不过这两个概念对于很多程序员并不关心,因为不知道这两个概念照样可以写出好程序.在C++11中对右值的概念进行了增强,我个人理解这部分内容是C++11引入的特性中最难以理解的了.该特性的引入至少可以解决C++98中的…
C++11 左值.右值.右值引用详解 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值. 在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址:表达式b+c.函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译. 右值.将亡值 在理…
本文为第八部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.html. Perfect Forwarding(完美转发):解决方案 对右值引用的两个规则中的第一个也同样影响了旧式的左值引用.回想在pre-11 C++时,对一个引用取引用是是不被允许的,比如A& &会导致一个编译器错误.相比之下,在C++11中,引入了如下所示的引用折叠规则(referenc…
本文为第六部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.html. Move语义和编译器优化 考虑下面这样的函数定义: X foo() { X x; // perhaps do something to x return x; } 现在同以前一样进行假设,给出一个X类,我们可以通过重载它的拷贝构造函数和拷贝赋值操作符来实现move语义.如果你看了一眼上面的函…
本文为第五部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.html. 右值引用就是右值吗? 同之前一样,给出一个X类,让我们可以重载它的拷贝构造函数和拷贝赋值操作符来实现move语义.现在做如下考虑: void foo(X&& x) { X anotherX = x; // ... } 一个有趣的问题就是,在foo函数内,哪一个x的拷贝构造函数重载将会被…
本文为第四部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/4220233.html. 强制Move语义 众所周知,正如C++标准的第一修正案所陈述:“委员会不会建立任何试图绊住C++程序员的脚的规则.(The committee shall make no rule that prevents C++ programmers from shooting themselves in the foot.)”,正经来说,就是当面临给予程序员更多控制还是减…
本文为第三部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/4220233.html. 右值引用 如果x是任意类型,那么x&&则被称作一个对x的右值引用(rvalue reference).为了更好区分,原来的引用x&现在也被称作左值引用(lvalue reference). 一个右值引用是一种同原始引用x&的行为非常类似的类型,但是有一些特例.最重要的一个就是当面临方法重载决议的时候,左值倾向于旧式的左值引用,而右值偏向于新的…
本文系对「C++ Rvalue References Explained」 该文的翻译,原文作者:Thomas Becker. 该文较详细的解释了C++11右值引用的作用和出现的意义,也同时被Scott Meyers推荐,全文共分11个部分,我将利用业余时间,分别翻译. 受笔者水平所限,可能叙述会出现些许问题,还望多多指正. 部分名词为了保持含义和方便理解,并未翻译成中文,有的在括号内给出了常见的中文翻译. 目录 概述 Move语义 右值引用 强制Move语义 右值引用就是右值吗? Move语义…
https://blog.csdn.net/hyman_yx/article/details/52044632 左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址:表达式b+c.函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名…
左值.右值 在C++11中所有的值必属于左值.右值两者之一,右值又可以细分为纯右值.将亡值.在C++11中可以取地址的.有名字的就是左值,反之,不能取地址的.没有名字的就是右值(将亡值或纯右值).举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址:表达式b+c.函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&(b+c)这样的操作则不会通过编译. 右值.将亡值 在理解C++11的右值前,先看看C++98中…
0 左值和右值     一个左值表达式代表的是对象本身,而右值表达式代表的是对象的值:变量也是左值.   1 右值引用作用 为了支持移动操作(包括移动构造函数和移动赋值函数),C++才引入了一种新的引用类型——右值引用,可以自由接管右值引用的对象内容. 2 右值引用绑定的对象     返回非引用类型的函数,产生右值的表达式(算术表达式.关系表达式.位.后置递增递减)   3 和左值引用的区别 绑定的对象(引用的对象)不同,左值引用绑定的是返回左值引用的函数.赋值.下标.解引用.前置递增递减 左值…
转自:https://liam0205.me/2016/12/11/rvalue-reference-in-Cpp/ 最近在改 XGBoost 的代码.XGBoost 在代码中使用了很多来自 C++11 标准中的特性,让我比较好奇和困惑的,就有其中关于右值引用的部分.涉及到代码里,有比较明显的两类用法: std::move 1 std::move(foo) std::unique_ptr 1 std::vector<std::unique_ptr<T>> 前者是使用 std::mo…
概念 在C++11中,区别表达式是左值或右值可以做这样的总结:当一个对象被用作右值的时候,用的是对象的值(内容):当对象被用作左值的时候,用的是对象的身份(在内存中的位置).左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的对象,即左值持久,右值短暂 以上的定义来自于C++Primer(5th)第121页和第471页.可能令人困惑,看了接下来的例子就明白了 [cpp] view plain copy int &&rr1 = 42;//正确,字面常量是右值 int &am…
转载:https://www.cnblogs.com/golaxy/p/9212897.html C++11的左值引用与右值引用总结 概念 1.&与&&  对于在C++中,大家对于符号“ & ”的第一映像是引用和取地址,对符号“ && ”的第一映像是逻辑与.但是在C++11中我们会看到下方这种表示方法: int &&k=i+k:1.1  对于第一眼见到上述的表达方式时,估计会一脸懵逼.下面对此做一个简述.   引用 & 是一个类型变量…
C++11新标准中的一个最主要的特性就是移动而非拷贝对象的能力.接下来简要介绍一下相关概念. 右值引用 所谓右值引用就是必须绑定到右值的引用.通过 && 而不是 & 来获得右值引用.右值引用有一个重要的性质 - 只能绑定到一个将要销毁的对象.因此我们可以自由的将一个右值引用的资源"移动"到另一个对象中. 一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值. 类似任何引用,一个右值引用也不过是某个对象的一个名字而已.对于一个常规引用(…
右值引用和移动操作是C++11提出的新概念,通过这些操作,可以降低拷贝操作带来的消耗.先来简单介绍一下左值和右值. 左值一般指的是一个对象,或者说是一个持久的值,例如赋值的返回值.下标操作.解引用以及前置递增等. 右值是一个短暂的值,比如一个表达式的求值结果.函数返回值以及一个字面值等. 为了区分,把一般的引用称为左值引用,必须绑定到右值的引用称为右值引用,以&&表示.右值引用有这两个特性: 右值引用只能绑定到临时对象,所引用的对象将要被销毁,并且没有其他用户. 这也意味着,我们可以自由地…
本文主要介绍了C++11中的移动语义与右值引用, 并且对其中的一些坑做了深入的讨论. 在正式介绍这部分内容之前, 我们先介绍一下rule of three/five原则, 与copy-and-swap idiom最佳实践. 本文参考了stackoverflow上的一些回答. 不能算是完全原创 rule of three/five rule of three是自从C++98标准问世以来, 大家总结的一条最佳实践. 这个实践其实很简单, 用一句话就能说明白: 析构函数, 拷贝构造函数, =操作符重载…
int &&i = ; //i绑定到了右值1 int b = ; cout << i << endl; //输出1 i = b; cout << i << endl; //输出2 为了支持移动操作(包括转移构造函数和转移赋值函数),C++引入了一种新的引用类型——右值引用,使用右值引用的代码可以自由的接管所引用对象的内容. 左值引用绑定的是返回左值引用的函数.赋值.下标.解引用.前置递增递减:右值只能绑定到临时对象,所引用的对象将要销毁或该对…
一直想试着把自己理解和学习到的右值引用相关的技术细节整理并分享出来,希望能够对感兴趣的朋友提供帮助. 右值引用是C++11标准中新增的一个特性.右值引用允许程序员可以忽略逻辑上不需要的拷贝:而且还可以用来支持实现完美转发的函数.它们都是实现更高效.更健壮的库. move语义 先不展开具体右值引用定义.先说说move语义.右值引用是用来支持move语义的.move语义是指将一个同类型的对象A中的资源(可能是在堆上分配,也可能是一个文件句柄或者其他系统资源)搬移到另一个同类型的对象B中,解除对象A对…
C++ 11 中的右值引用 右值引用的功能 首先,我并不介绍什么是右值引用,而是以一个例子里来介绍一下右值引用的功能: #include <iostream>    #include <vector>    using namespace std;    class obj    {    public :        obj() { cout << ">> create obj " << endl; }        ob…
见下图: 规律总结: 只要我们传递一个基本类型是A④的左值,那么,传递后,T的类型就是A&,形参在函数体中的类型就是A&. 只要我们传递一个基本类型是A的右值,那么,传递后,T的类型就是A,形参在函数体中的类型就是A&&. 另外,模板参数类型推导是保留cv限定符(cv-qualifier,const和volatile限定符的统称)的,具体例子见<完美转发和标准库forward函数>. ①这里指形参在函数体中的实际类型 ②函数返回的不具名左值引用依旧是左值,例如,…
对于c++11来说移动语义是一个重要的概念,一直以来我对这个概念都似懂非懂.最近翻翻资料感觉突然开窍,因此记下.其实搞懂之后就会发现这个概念很简单,并无什么高深的地方. 先说说右值引用.右值一般指的是表示式中的临时变量,在c++中临时变量在表达式结束后就被销毁了,之后程序就无法再引用这个变量了.但是c++11提供了一个方法,让我们可以引用这个临时变量.这个方法就是所谓的右值引用. 那么右值引用有什么用呢?避免内存copy! 不同于其它语言,在c++里变量是值语义(在JAVA.Python变量是引…
在vs2012(c++)make_pair()改动: C++: template <class T1, class T2> pair<V1, V2> make_pair(T1&& x, T2&& y);如果没有指定类型,它会自动推导. C++: template <class T1, class T2> pair<T1, T2> make_pair(T1 x, T2 y); 如果make_pair用在了insert中,建议直接…
http://blog.chinaunix.net/uid-20726254-id-3486721.htm 这个绝对是新增的top特性,篇幅非常多.看着就有点费劲,总结更费劲. 原来的标准当中,参数与返回值的传值形式涉及到对象的复制,传值完成后,中间产生的临时对象又会马上被销毁,某些自定义的对象或者容器有很多元素时复制的开销非常大,而且例如IO对象或unique_ptr对象也不允许复制:传址在返回值的某些场景又会有局部对象的问题.c++11中新增了move的概念,用一个词描述就是"steal&q…
VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C++ 的新标准 C++11 已经发布一段时间了.本文介绍了新标准中的一个特性,右值引用和转移语义.这个特性能够使代码更加简洁高效. 新特性的目的 右值引用 (Rvalue Referene) 是…
C++11支持move语义,用以避免非必要拷贝和临时对象. 具体内容见收藏中的“C++右值引用” .…
C++11中引入的一个非常重要的概念就是右值引用.理解右值引用是学习“移动语义”(move semantics)的基础.而要理解右值引用,就必须先区分左值与右值. 注意:左值右值翻译可能有些问题 *L-value中的L指的是location,表示可寻址. *R-value中的R指的是read,表示可读. 对左值和右值的一个最常见的误解是:赋值运算符左边的就是左值,赋值运算符右边的就是右值.左值和右值都是针对表达式而言的,左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束时就不再存在的临…
看了很多篇文章,现在终于搞懂了C++ 中的右值以及std::move   左值和右值最重要的区别就是右值其实是一个临时的变量 在C++ 11中,也为右值引用增加了新语法,即&&   比如如下代码: void testFunc(int &i ) { std::cout<<"reference test func int"<<std::endl; } void testFunc( int &&i ) { std::cout&l…
原文出处:http://kuring.me/post/cpp11_right_reference May 18, 2015 移动构造函数 C++98中的左值和右值 C++11右值引用和移动语义 强制移动语义std::move() 右值引用和右值的关系 完美转发 引用折叠推导规则 特殊模板参数推导规则 解决完美转发问题 引用 在C++98中有左值和右值的概念,不过这两个概念对于很多程序员并不关心,因为不知道这两个概念照样可以写出好程序.在C++11中对右值的概念进行了增强,我个人理解这部分内容是C…