C++语言学习
## 左右值引用
[参考文献1:一文读懂C++右值引用和std::move](https://zhuanlan.zhihu.com/p/335994370)
基本区分:有地址的变量是左值,没地址的字面值临时值及时右值
**左值引用**
const int& a 的使用场景
这个被称为const左值引用,
特性:通过该引用建立的变量,无法进行修改,因此可以将该引用绑定到临时变量上。
```
void push_back(int &a);
int a = 4;
对于vec.push_back(4);
就会出现int &a = 4;这种左值引用指向右值的问题,会编译失败
const左值引用不会修改指向值
void push_back(const int &a) 则会避免这种情况
```
**右值引用**
右值引用专门为右值而生,可以指向右值,不能指向左值
```
int &&ref_a_right = 5; // ok
int a = 5;
int &&ref_a_left = a; // 编译不过,右值引用不可以指向左值
ref_a_right = 6; // 右值引用的用途:可以修改右值
```
使用场景:移动构造(a=b,b的复制给a后同时删除b,这就不得不使用右值引用了)
**std::move()**
该函数会将左值强制转换为右值,让右值引用可以指向左值,同时move的变量会失去原有值
```
1. 从性能上讲,左右值引用没有区别,传参使用左右值引用都可以避免拷贝。
2. 右值引用可以直接指向右值,也可以通过std::move指向左值;而左值引用只能指向左值(const左值引用也能指向右值)。
3. 作为函数形参时,右值引用更灵活。虽然const左值引用也可以做到左右值都接受,但它无法修改,有一定局限性。
```
const 在修饰返回值时可以起到保护的左右
explicit 是对于构造函数的修饰,防止隐式转换,保证vector (4), 防止 vector a = 4;
[参考文献1:一文读懂C++右值引用和std::move](https://zhuanlan.zhihu.com/p/335994370)
基本区分:有地址的变量是左值,没地址的字面值临时值及时右值
**左值引用**
const int& a 的使用场景
这个被称为const左值引用,
特性:通过该引用建立的变量,无法进行修改,因此可以将该引用绑定到临时变量上。
```
void push_back(int &a);
int a = 4;
对于vec.push_back(4);
就会出现int &a = 4;这种左值引用指向右值的问题,会编译失败
const左值引用不会修改指向值
void push_back(const int &a) 则会避免这种情况
```
**右值引用**
右值引用专门为右值而生,可以指向右值,不能指向左值
```
int &&ref_a_right = 5; // ok
int a = 5;
int &&ref_a_left = a; // 编译不过,右值引用不可以指向左值
ref_a_right = 6; // 右值引用的用途:可以修改右值
```
使用场景:移动构造(a=b,b的复制给a后同时删除b,这就不得不使用右值引用了)
**std::move()**
该函数会将左值强制转换为右值,让右值引用可以指向左值,同时move的变量会失去原有值
```
1. 从性能上讲,左右值引用没有区别,传参使用左右值引用都可以避免拷贝。
2. 右值引用可以直接指向右值,也可以通过std::move指向左值;而左值引用只能指向左值(const左值引用也能指向右值)。
3. 作为函数形参时,右值引用更灵活。虽然const左值引用也可以做到左右值都接受,但它无法修改,有一定局限性。
```
const 在修饰返回值时可以起到保护的左右
explicit 是对于构造函数的修饰,防止隐式转换,保证vector (4), 防止 vector a = 4;
全部评论
那篇文章写的有点问题,这个理解也有问题
左值右值是一个表达式的属性,叫做值类别,不是修饰变量的。a = b 中的 b 是左值,是变量名 b 构成的标识符表达式是左值,不是变量是左值
move一个变量不会失去原有值,move只是将一个左值表达式转为亡值表达式,从而能调用移动构造/移动赋值,没有对变量做出任何修改。转换后的亡值表达式指代的那个变量会不会失去值,和move没有关系
左右值引用也和性能没有直接关系,只能说传递引用的过程不会发生拷贝,实际还是要看函数在做什么,有些情况下使用值传递也不会导致额外拷贝:https://stackoverflow.com/questions/51705967/advantages-of-pass-by-value-and-stdmove-over-pass-by-reference
相关推荐