文章目录
一、万能引用
万能引用是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后实现高效泛型编程的关键技术之一。
511

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



