引用折叠 (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 的实际类型,其中 TR 和 T 都不是由cv-qual席限定符限定的。| 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&& |
注意:
|
||
T 和 TR 都是引用类型,但都不是 rvalue 引用类型时, var 是 lvalue 引用类型。示例 1
typedef int& T;
// a has the type int&
T&& a; 在此示例中, T 的类型为 int& ,声明的类型 a 为 T&&。 引用折叠后, 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 也是引用类型。 如果 TR 或 T 由cv-qual席限定符限定,那么下表中针对不同情况列出了 var 的实际类型。| 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&& |
注意:
|
||
T 是引用类型时, var 的类型仅从 T继承 cv 限定符。