Ch08-C++ 之 reference
April 27, 2022
lvalue reference,lvalue reference。
1. 左值 VS 右值 #
| 类型 | 说明 |
|---|---|
| 左值 | 能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持久对象。 |
| 右值 | 不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象。 |
右值又可以细分为纯右值和将亡值。
| 类型 | 说明 |
|---|---|
| 纯右值 | 指生命期即将结束的值,一般是跟右值引用相关的表达式,这样表达式通常是将要被移动的对象,如返回类型为 T&&的函数返回值(如 std::move)、经类型转换为右值引用的对象(如 static_cast<T&&>(obj)) |
| 将亡值 | 不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象。 |
2. 左值引用 VS 右值引用 #
- 左值引用是具名变量/对象的别名
- 右值引用是匿名变量/对象的别名
左值和右值是独立于它的类型的,即左右值与类型没有直接关系,它们是表达式的属性。具名的右值引用是左值,匿名的右值引用是右值。
如 Type&& t 中 t 是个具名变量(最简单的表达式),t 的类型是右值引用类型,但具有左值属性。 而 Type&& func() 中的返回值(是个表达式)是右值引用类型,但具有右值属性(因为是个匿名对象)
| 引用类型 | 非常量左值 | 常量左值 | 非常量右值 | 常量右值 | 说明 |
|---|---|---|---|---|---|
| Type& | Y | N | N | N | 只能绑定到非常量左值 |
| const Type& | Y | Y | Y | Y | 万能类型、用于拷贝语议 |
| Type&& | N | N | Y | N | 只能绑定到右值。用于移动语义和完美转发 |
| const Type&& | N | N | Y | Y | 暂无用途 |
3. 万能引用 #
3.1 && 含义
#
- 右值引用:当 T 是确定的类型时,
T&&为右值引用。如int&& a - 万能引用:当 T 存在类型推导时,
T&&为万能引用,表示一个未定的引用类型。如果被右值初始化,则T&&为右值引用。如果被左值初始化,则T&&为左值引用。一般与 template 搭配使用。
3.2 引用折叠 #
auto&& 或 T&& 存在类型推导时,它可能是左值引用,也可能是右值引用,取决于初始化的值类型。如果多个 & 进行叠加,会出现引用折叠的现象。
| 原始引用 | 折叠引用 | 说明 |
|---|---|---|
| T&& && | T&& | 右值引用 |
| T&& & | T& | 左值引用 |
| T& && | T& | 左值引用 |
| T& & | T& | 左值引用 |