左值引用和右值引用的区别和联系?
时间: 2023-08-21 22:02:01 浏览: 91
左值引用(Lvalue Reference)和右值引用(Rvalue Reference)是 C++11 引入的两种引用类型,它们在语法上有区别,且在用途和使用场景上也有所不同。
区别:
1. 左值引用:左值引用使用 `&` 符号来声明,它绑定到左值(具名对象)上,可以被修改。它主要用于传递参数、函数重载和拷贝构造函数等场景。
```cpp
int x = 10;
int& lref = x; // 左值引用绑定到左值 x
lref = 20; // 修改了 x 的值
```
2. 右值引用:右值引用使用 `&&` 符号来声明,它主要绑定到右值(临时对象、表达式结果等)上,可以被修改。它主要用于移动语义、完美转发和实现移动构造函数、移动赋值操作符等场景。
```cpp
int&& rref = 10; // 右值引用绑定到右值 10
rref = 20; // 修改了右值 10 的值
```
联系:
1. 引用类型:左值引用和右值引用都属于引用类型,它们都是对已存在的对象进行别名引用。
2. 引用折叠:当左值引用和右值引用与模板参数结合时,会发生引用折叠。引用折叠规则如下:
- `T& &` 或 `T& &&` 折叠为 `T&`
- `T&& &` 折叠为 `T&`
- `T&& &&` 折叠为 `T&&`
```cpp
template<typename T>
void foo(T&& val); // T&& 可以同时接受左值和右值参数
int x = 10;
foo(x); // T 为 int&,左值引用折叠,传递 x 的左值引用
foo(20); // T 为 int&&,右值引用折叠,传递 20 的右值引用
```
总结起来,左值引用和右值引用在语法上有区别,左值引用主要用于绑定和修改左值对象,右值引用主要用于绑定和修改右值对象。它们都属于引用类型,且在一些特定的场景中有联系,如引用折叠。左值引用和右值引用是 C++ 中支持更多灵活性和效率的重要特性。
阅读全文