首页 > 后端开发 > C++ > 正文

C++如何在语法中使用引用折叠和万能引用

P粉602998670
发布: 2025-09-15 08:50:01
原创
1041人浏览过
引用折叠规则规定T&或T&&组合时,只要存在左值引用则结果为左值引用,否则为右值引用;万能引用是模板中可推导的T&&类型,能根据实参推导为左值或右值引用,并与std::forward配合实现完美转发,仅在模板参数且类型被推导时成立。

c++如何在语法中使用引用折叠和万能引用

在C++中,引用折叠和万能引用(也叫转发引用)是模板和类型推导中的重要机制,尤其在实现完美转发时非常关键。理解它们有助于写出更高效的泛型代码。

引用折叠规则

引用折叠是一种在模板实例化或类型推导过程中,多个引用符号合并成一个引用的规则。C++规定了四种引用折叠情况:

  • T& & 折叠为 T&
  • T& && 折叠为 T&
  • T&& && 折叠为 T&&
  • T&& & 折叠为 T&

简单记法:只要出现左值引用,结果就是左值引用;只有全是右值引用时,结果才是右值引用。

万能引用(Universal Reference)

“万能引用”这个术语由Scott Meyers提出,实际上指的是形式为 T&& 的模板参数,其中T是模板类型参数。它之所以“万能”,是因为它可以根据初始化表达式的值类型推导为左值引用或右值引用。

立即学习C++免费学习笔记(深入)”;

关键条件是:

  • 必须是模板参数 T&&
  • 类型T必须被推导(不能显式指定)

例如:

template<typename T>
void func(T&& param) {
  // param 是万能引用
}

调用时:

AppMall应用商店
AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56
查看详情 AppMall应用商店
  • func(obj); // obj是左值 → T 推导为 Type&,param 类型是 Type&
  • func(std::move(obj)); // 右值 → T 推导为 Type,param 类型是 Type&&

与std::forward配合实现完美转发

万能引用常用于保存参数,再通过 std::forward 保持其原始值类别进行转发。

示例:

template<typename T>
void wrapper(T&& arg) {
  target(std::forward<T>(arg));
}

这里:

  • 如果传入左值,T 推导为 T&,std::forward 返回左值引用
  • 如果传入右值,T 推导为 T,std::forward 返回右值引用

这样就能实现“该拷贝的拷贝,该移动的移动”,即完美转发。

常见误区

不是所有 T&& 都是万能引用。例如:

void func(MyClass&& param); // 这是右值引用,不是万能引用
template<typename T>
void func(std::vector<T>&& vec); // 参数类型不是 T&&,而是 vector<T>&&,不涉及类型推导,不是万能引用

只有在模板中且类型被推导的 T&& 才是万能引用。

基本上就这些。掌握引用折叠和万能引用,能让你更好地理解 move、forward 和模板参数传递的行为。不复杂但容易忽略细节。

以上就是C++如何在语法中使用引用折叠和万能引用的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号