
⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///
WARNING \]: DETECTING HIGH ENERGY
**🌊 🌉 🌊 心手合一 · 水到渠成**

|------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
| **\>\>\> ACCESS TERMINAL \<\<\<** ||
| [**\[ 🦾 作者主页 \]**](https://blog.csdn.net/fengtinghuqu520?spm=1000.2115.3001.5343) | [**\[ 🔥 C语言核心 \]**](https://blog.csdn.net/fengtinghuqu520/category_12955956.html) |
| [**\[ 💾 编程百度 \]**](https://blog.csdn.net/fengtinghuqu520/category_13083835.html) | [**\[ 📡 代码仓库 \]**](https://blog.csdn.net/fengtinghuqu520/article/details/147275999?spm=1001.2014.3001.5502) |
---------------------------------------
Running Process: 100% \| Latency: 0ms
*** ** * ** ***
#### 索引与导读
*
* [一、左值和右值](#一、左值和右值)
* [二、左值引用 与 右值引用](#二、左值引用 与 右值引用)
*
* [左值引用](#左值引用)
* [右值引用](#右值引用)
* [三、引用延长生命周期](#三、引用延长生命周期)
* [四、左值和右值的参数匹配](#四、左值和右值的参数匹配)
* [五、移动语义](#五、移动语义)
*
* [5.1)为何需要移动语义?](#5.1)为何需要移动语义?)
* [5.2)移动构造函数](#5.2)移动构造函数)
* [5.3)移动赋值运算符](#5.3)移动赋值运算符)
* [5.4)std::move](#5.4)std::move)
* [六、左值引用 和 右值引用 的使用场景回顾](#六、左值引用 和 右值引用 的使用场景回顾)
*
* [6.1)左值引用的主要使用场景](#6.1)左值引用的主要使用场景)
*
* [函数参数传递(避免拷贝)](#函数参数传递(避免拷贝))
* [函数返回值](#函数返回值)
* [6.2) 右值引用 和 移动语义 解决传值返回问题](#6.2) 右值引用 和 移动语义 解决传值返回问题)
*
*
* [直接初始化(移动构造)](#直接初始化(移动构造))
* [先定义再赋值(赋值运算符)](#先定义再赋值(赋值运算符))
* [七、右值引用(T\&\&)和移动语义 出现的核心场景](#七、右值引用(T&&)和移动语义 出现的核心场景)
*
* [7.1)容器类](#7.1)容器类)
* [7.2)智能指针](#7.2)智能指针)
* [7.3)输入输出流](#7.3)输入输出流)
* [7.4)其他资源管理类](#7.4)其他资源管理类)
* [八、 右值引用和移动语义在传参中的提效](#八、 右值引用和移动语义在传参中的提效)
* [九、类型分类](#九、类型分类)
* [十、引用折叠](#十、引用折叠)
*
* [口诀](#口诀)
* [十一、完美转发](#十一、完美转发)
* [💻结尾--- 核心连接协议](#💻结尾— 核心连接协议)
### 一、左值和右值
> [🔗Lucy的空间骇客裂缝:](https://ask.csdn.net/questions/9451959)
*** ** * ** ***
### 二、左值引用 与 右值引用
| 特性 | 左值引用 (`T&`) | 右值引用 (`T&&`) |
|:---------|:-------------|:--------------|
| **绑定对象** | 绑定到左值 | 绑定到右值(临时对象) |
| **持久性** | 对象生命周期由作用域决定 | 延长临时对象的生命周期 |
| **主要目的** | 避免拷贝,共享内存 | 实现移动语义,减少重复开销 |
#### 左值引用
我们平时用的引用就是左值引用,**它只能绑定到左值上**
```cpp
int a = 10;
int& ref1 = a; // 合法:a 是左值
// int& ref2 = 10; // 非法:10 是右值,不能绑定到普通的左值引用
```
常量左值引用 (`const int&`) 可以绑定到右值,这在 `C++98` 中是为了让函数能接受临时变量作为参数
```cpp
void printString(const string& str) {
cout << str << endl;
}
```
此时`printString("C++")`就能完美编译了
*** ** * ** ***
#### 右值引用
右值引用的语法是**两个 `&`**
**核心作用:** 绑定到右值(临时对象)上,并延长这个临时对象的生命周期
```cpp
int&& rref = 10; // 合法:rref 绑定到了右值 10 上
// int&& rref2 = a; // 非法:a 是左值,右值引用不能绑定到左值
```
*** ** * ** ***
### 三、引用延长生命周期
右值引用可用于为临时对象延长生命周期
`const` 的左值引用也能延长临时对象生存期,但这些对象无法被修改
```cpp
int main()
{
string s1 = "Test";
//❌错误:不能绑定到左值
/*string&& r1 = s1;*/
//OK: 对 const 的左值引用延长生存期
const string& r2 = s1 + s2;
//❌错误:不能通过到 const 的引用修改
/* r2 += "Test";*/
//OK: 右值引用延长生存期
string&& r3 = s1 + s2;
//OK: 能通过到非 const 的引用修改
r3 += "Test";
return 0;
```
*** ** * ** ***
### 四、左值和右值的参数匹配
* `C++98` 中,我们实现一个 `const` 左值引用作为参数的函数,那么实参传递左值和右值都可以匹配
* `C++11` 以后,分别重载左值引用、`const` 左值引用、右值引用作为形参的 `f` 函数,那么实参是左值会匹配(左值引用),实参是 `const` 左值会匹配(`const` 左值引用),实参是右值会匹配(右值引用)
```cpp
#include