C++11增加了移动特性(把资源所有权交出给新对象),基于两个原因:
因此引出新的引用类型——右值引用:必须绑定到右值的引用。我们通过 &&来获得右值引用。
右值引用有一个重要性质——只能绑定到一个将要摧毁的对象。因此可以自由地将一个右值引用资源移动到另一个对象。
C++03标准中将表达式分为左值和右值,并且“非左即右”:
区分一个表达式是左值还是右值,最简便的方法就是看能不能够对它取地址:如果能,就是左值;否则,就是右值。
能标识一个对象的表达式 或 函数 的表达式就是左值表达式。
右值引用的引入,使得C++11标准中对表达式的分类不再是非左值即右值那么简单。
每个C++表达式只属于三种基本值类别中的一种:左值 (lvalue)、纯右值 (prvalue)、将亡值 (xvalue)。
C++11标准中对表达式的分类,简单解释如下:
依据是否可以移动,值类别可以分为:
xvalue(expiring value)将亡值
通常指代一个生存周期即将结束的值(因此其资源可以被转移)。是某些涉及到右值引用的表达式的值,根据C++11标准,以下四种情况属于xvalue:
一般来说,具名的右值引用(named rvalue reference)属于左值,不具名的右值引用(unamed rvalue reference)就属于xvalue,而对函数的右值引用不论是否具名都当做左值处理。
举例:
struct A {
int m;
};
A&& operator+(A, A);
A&& f();
A a;
A&& ar = static_cast<A&&>(a);
f()、f().m、static_cast(a)、a+a都是将亡值xvalue,ar是左值。
参考:
https://blog.csdn.net/loveyumomo/article/details/23214341
https://www.cnblogs.com/zpcdbky/p/5275959.html
https://www.cnblogs.com/KillerAery/p/12802771.html