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& | 左值引用 |