C++ 新特性 | C++ 11 | 引用折叠机制


前言:

引用折叠是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++移动语义、完美转发等特性的关键基础,它使得模板能够更智能地处理各种引用情况。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值