1.右值和左值的概念
在C++11中 引入了右值引用和移动语义,可以避免一些复制的情况,提高了程序的性能
左值:表达式后依然能找到的持久对象,而右值是表达式后就会消失的对象,长见的左值有具名变量,函数或成员函数的名字,一些返回左值的引用表达式类似与++i,而右值又分为将亡右值和纯右值,纯右值可以是一些很长见的数字比如 42,x++等,而将亡右值 是在过程中会产生一个临时变量,但又不用左值去引用他,比如函数返回的非引用变量,C++中左右的值类型,都将是左值,将亡右值,纯右值之一,而区分左值和右值的区别就是看是否能够对值进行取地址,能取地址的就是左值
2. && 右值引用特性
2.1 右值引用是对一个右值进行引用,以此来延长该右值的生命周期,无论是左值还是右值都必须在初始化的时候引用它,因为引用类型并不具有绑定内存的操作,只是类型的别名
2.2 引用折叠
A: 左值和右值都是独立于它们的类型的,右值引用类型可以是左值也可以是右值
B:* 所有的右值引用叠加到右值引用还是右值引用 && &&, 其他的引用都会折叠为左值引用 当T&&为模板参数时输入左值为左值引用,输入右值就是右值应用 具体的折叠如下*
&& && ------> &&
& && --------> &
& &----------->&
&& &---------> &
C 编译器会将已经命名的右值引用视为左值,而未命名的变量设置为右值
3.右值引用优化性能,避免深拷贝
#inlude<iostream>
#include<cstdio>
#include<cstdlib>
#include<string.h>
using namespace std;
class MyString
{
public:
MyString()
{
m_data = null;
m_len =0;
}
~MyString()
{
delete m_data;
m_data = nullptr;
}
MyString(const char*p)
{
m_len =