前言
以下是本人学习多线程时临时学到的内容,文章删删改改,发现自己对这方面理解仍然不够精确,用词也不严谨,而且十分啰嗦,但希望可以为你理解C++11的右值引用提供帮助。
左值与右值是什么?
- 左值其实就是像变量等可以长期存在,通常出现在赋值运算符左边的东西,可以浅显地理解为就是变量。
- 而右值相对于左值,是如字面量等表示某个值但不具有持久的身份与内存空间。
用代码来解释:
int a = 42;
// a 是一个变量,在执行完上面的语句后,其仍然可以存在,属于左值
// 42 是一个字面,在上面语句结束后,存放其内容的内存会立即释放,属于右值
左值引用与右值引用
引用大家都明白,是为一个变量取一个”别名“,对引用进行修改会直接改变该变量的值,本质上是引用与原来的变量共用了同一块内存空间,其实这种”传统“的引用就是左值引用,我更喜欢理解为:"所引用的对象是一个左值"或者”对左值引用“。
int a =42; // 创建一个变量a
int &b = a; //创建了一个引用b,这里b所引用的对象是a,而a是左值,这就属于左值引用
b -= 42; // 对b修改
cout<<a<<endl; //a的值改变
同样的方式,右值引用其实也可以大致理解为:所引用的对象是右值,但是我们之前特意说过:右值的生命周期很短,如果在直接对一个右值创建一个引用,创建完后这个右值就会被释放,不就是引用了一个”寂寞“吗?在C++里,编译时会直接报错。
int &b = 42; // 编译错误
而不会报错的右值引用是这样的:
int && b = 42;// 编译不会报错
你可能会疑惑,这还不是对右值创建了引用了吗?这么编译时不会出错?
类似于左值引用:“引用与变量都有对一块内存的所有权”,右值引用会先将右值对象的生命周期延长了,之后与该对象共同拥有内存的所有权。。
以下是对其的图解: