引用折叠 (C++11)

在 C++11之前,对引用的引用在 C++ 语言中格式不正确。 在 C++11中,当您通过下列其中一个上下文使用对引用的引用时,引用折叠规则适用:
  • decltype 说明符
  • typedef 名称
  • 模板类型参数
您可以定义变量 var ,其声明的类型 TR 是对类型 T的引用,其中 T 也是引用类型。 例如
// T denotes the int& type
typedef int& T;
 
// TR is an lvalue reference to T
typedef T& TR;

// The declared type of var is TR
TR var; 
下表中针对不同情况列出了 var 的实际类型,其中 TRT 都不是由cv-qual席限定符限定的。
表 1. 引用正在折叠而不使用 cv 限定符
T TR 类型 var
A T A1
A T& A&1
A T&& A&&1
A& T A&1
A& T& A&
A& T&& A&
A&& T A&&1
A&& T& A&
A&& T&& A&&
注意:
  1. 在这种情况下,引用折叠不适用,因为 TTR 不是两种引用类型。
此表中的一般规则是,当 TTR 都是引用类型,但都不是 rvalue 引用类型时, var 是 lvalue 引用类型。
示例 1
typedef int& T;

// a has the type int&
T&& a; 
在此示例中, T 的类型为 int& ,声明的类型 aT&&。 引用折叠后, a 的类型为 int&
示例 2
template <typename T> void func(T&& a);
auto fp = func<int&&>;
在此示例中, T 的实际参数为 int&& 类型,声明的 a 类型为 T&&。 形成对 rvalue 引用的 rvalue 引用。 引用折叠后, a 的类型为 int&&
示例 3
auto func(int& a) -> const decltype(a)&;
在此示例中,作为尾部返回类型的 decltype(a)引用参数 a,其类型为 int&。 引用折叠后, func 的返回类型为 int&
您可以定义变量 var ,其声明的类型 TR 是对类型 T的引用,其中 T 也是引用类型。 如果 TRT 由cv-qual席限定符限定,那么下表中针对不同情况列出了 var 的实际类型。
表 2。 使用 cv 限定符折叠引用
T TR 类型 var
A const T const A1
const A volatile T& const volatile A&1
A const T&& const A&&1
A& const T A&1
const A& volatile T& const A&
const A& T&& const A&
A&& const T A&&1
const A&& volatile T& const A&
const A&& T&& const A&&
注意:
  1. 在这种情况下,引用折叠不适用,因为 TTR 不是两种引用类型。
此表的一般规则是,当 T 是引用类型时, var 的类型仅从 T继承 cv 限定符。