Ch08-C++ 之 reference

Ch08-C++ 之 reference

April 27, 2022
C++ | Basic
c++

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