C++ 新特性 | C++ 11 | 万能引用与完美转发

一、万能引用

万能引用是C++11引入的一个重要概念,由Scott Meyers提出,它实际上是对转发引用(Forwarding Reference)的一种通俗称呼。

1、什么是万能引用?

万能引用是一种能够绑定到左值、右值、const和非const对象的引用。它的语法形式是:

T&&

其中T是一个推导类型(通过模板参数推导或auto推导)。

2、主要特点

  • 双重身份:既能绑定左值也能绑定右值
  • 类型推导依赖:只有在类型推导的上下文中T&&才是万能引用
  • 完美转发:常与std::forward配合实现完美转发

3、使用场景

3.1、模板函数参数

template<typename T>
void foo(T&& arg) {  // arg是万能引用
    // ...
}

3.2、auto声明

auto&& var = some_expression;  // var是万能引用

二,使用std::forword实现完美转发

1、std::forword 简介

std::forward 是 C++ 标准库中实现完美转发的关键工具,其核心作用是有条件地将参数转换为右值引用,保持原始参数的值类别(左值/右值)。

  • 源码简化版
template<typename T>
T&& forward(typename std::remove_reference<T>::type& arg) noexcept {
    return static_cast<T&&>(arg);
}

template<typename T>
T&& forward(typename std::remove_reference<T>::type&& arg) noexcept {
    static_assert(!std::is_lvalue_reference<T>::value, 
                 "Cannot forward an rvalue as an lvalue");
    return static_cast<T&&>(arg);
}
  • 转换逻辑
    • 如果原始参数是左值,forward 返回左值引用
    • 如果原始参数是右值,forward 返回右值引用
  • 关键点
    • 依赖引用折叠规则(Reference Collapsing)
    • 必须与万能引用(T&&)配合使用
    • 编译时决定转换类型,无运行时开销

std::forward 本质是一个有条件的 static_cast,确保参数在转发过程中保持其原始的值类别。

2、完美转发

完美转发(Perfect Forwarding)允许函数模板将参数原封不动地转发给其他函数,保持参数的:

  • 左值/右值属性
  • const/volatile限定符
  • 精确类型

核心机制

  • 万能引用(T&&):接收任意类型的参数
  • std::forward:有条件地转换为左值或右值

工作原理:

  • 当传入左值时:T推导为左值引用,forward返回左值引用
  • 当传入右值时:T推导为普通类型,forward返回右值引用

典型实现:

template<typename T>
void wrapper(T&& arg) {
    // 完美转发arg
    target_function(std::forward<T>(arg));
}

完美转发是C++11后实现高效泛型编程的关键技术之一。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值