前言:
引用折叠是C++11引入的类型推导规则,用于处理多重引用嵌套的情况,是现代C++模板编程的重要基础机制。
一、引用折叠机制
1、基本规则
在 C++ 中,当使用万能引用(universal reference,即
T&&)时,模板参数T的推导规则如下:
- 如果传入的是左值(lvalue)或左值引用(lvalue reference):
T会被推导为 左值引用类型(即T&)。- 因此,
T&&会按照引用折叠规则变成T& &&,折叠后仍然是T&(左值引用)。
- 如果传入的是右值(rvalue)或右值引用(rvalue reference):
T会被推导为 非引用类型(即T)。- 因此,
T&&保持为T&&(右值引用)。
具体推导示例:
template <typename T>
void foo(T&& arg) {
// ...
}
int x = 42;
const int y = 10;
foo(x); // x 是左值,T 推导为 int&,arg 类型是 int&
foo(y); // y 是 const 左值,T 推导为 const int&,arg 类型是 const int&
foo(100); // 100 是右值,T 推导为 int,arg 类型是 int&&
2、引用折叠规则
在模板推导或
auto&&场景下,引用折叠规则如下:
T& &→T&T& &&→T&T&& &→T&T&& &&→T&&
关键点:
- 万能引用
T&&只有在模板推导或auto&&时才是“万能”的(即可以绑定左值或右值)。 - 如果
T是具体类型(如int&&),则只是普通的右值引用,不能绑定左值。
记忆口诀:只有"双右得右",其他情况都折叠为左值引用。
3、核心作用
- 使万能引用(Universal Reference)成为可能
- 支持完美转发(Perfect Forwarding)的实现
- 保证模板类型推导的正确性
4、应用场景
- 模板函数参数推导
template<typename T>
void func(T&& arg) { // T&&会根据传入参数折叠
// arg可能是左值或右值引用
}
- auto类型推导
auto&& x = getValue(); // x类型由getValue()返回值决定
- typedef/using类型别名组合
using LRef = int&;
using RRef = int&&;
LRef&& r1 = ...; // 折叠为int&
引用折叠机制是理解现代C++移动语义、完美转发等特性的关键基础,它使得模板能够更智能地处理各种引用情况。
7575

被折叠的 条评论
为什么被折叠?



