全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++中的模板参数推导规则_c++ универсальные ссылки与引用折叠

模板参数推导结合通用引用和引用折叠实现完美转发,如std::make_unique通过T&&推导实参类型,依据引用折叠规则保持值类别,使std::forward能原样转发参数给目标函数。

在C++中,模板参数推导和引用折叠是理解泛型编程(尤其是完美转发和通用引用)的关键机制。它们共同支撑了现代C++中高效、灵活的接口设计,比如 std::make_uniquestd::forward 和各种工厂函数。

模板参数推导规则(Template Argument Deduction)

当编译器根据函数调用的实参自动确定模板参数类型时,就发生了模板参数推导。最常见的场景是函数模板:

template
void func(T param);

func(42); // T 被推导为 int,param 类型是 int func("hello"); // T 被推导为 const char[6],param 是 const char*

但推导行为会因参数类型的不同而变化。以下是几种常见情况:

  • 值类型(T param):会忽略顶层 const 和引用,数组和函数会退化为指针。
  • 引用类型(T& param):保留底层 const,不退化数组或函数类型。
  • 通用引用(T&& param):这是最关键的场景,支持引用折叠,并允许实现完美转发。

通用引用(Universal References)与右值引用(Rvalue References)

Scott Meyers 提出“通用引用”这个术语来描述出现在模板和 auto 声明中的 T&&。它既可以绑定左值,也可以绑定右值,具体类型由初始化表达式决定:

template
void func(T&& param) { /* param 是通用引用 */ }

int x = 42; func(x); // x 是左值 → T 被推导为 int&,param 类型是 int&&(但实际是左值引用) func(42); // 42 是右值 → T 被推导为 int,param 类型是 int&&

注意:只有在模板参数推导发生时,T&& 才是通用引用。像 void func(int&&) 这样的明确右值引用就不是通用引用。

引用折叠规则(Reference Collapsing Rules)

引用折叠是 C++11 引入的核心规则,用于解决“引用的引用”这种非法语法。规则如下:

  • T&& && → T&&
  • T&& & → T&
  • T& && → T&
  • T& & → T&

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

引用折叠在通用引用和 std::forward 中起关键作用。例如:

template
void wrapper(T&& arg) {
    target(std::forward(arg));  // 保持原始值类别
}

当传入左值时,T 被推导为 U&(U 是实际类型),std::forward 返回 U&;传入右值时,T 是 Ustd::forward 返回 U&&,从而实现完美转发。

实际应用:完美转发(Perfect Forwarding)

结合模板推导、通用引用和引用折叠,可以实现函数模板将参数原样转发给另一个函数:

template
std::unique_ptr make_unique(U&& u) {
    return std::unique_ptr(new T(std::forward(u)));
}

无论 u 是左值还是右值,std::forward 都能正确保留其值类别,调用匹配的构造函数。

基本上就这些。掌握这些规则后,就能理解 STL 中大多数泛型代码的设计原理。


# app  # c++  # 构造函数  # const  # auto  # int  # void  # 指针  # 接口  # 函数模板  # 值类型  # 引用类型  # 泛型  # 实参  # 才是  # 绑定  # 这是  # 尤其是  # 就能  # 都能  # 出现在  # 几种  # 可以实现  # 最关键 


相关文章: ,巨量百应是干嘛的?  javascript中对象的定义、使用以及对象和原型链操作小结  Python多线程使用规范_线程安全解析【教程】  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站VPS能否同时实现高效与安全翻墙?  如何配置WinSCP新建站点的密钥验证步骤?  已有域名和空间,如何快速搭建网站?  定制建站如何定义?其核心优势是什么?  建站主机如何选?性能与价格怎样平衡?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何通过二级域名建站提升品牌影响力?  建站之星如何防范黑客攻击与数据泄露?  如何在IIS中配置站点IP、端口及主机头?  教学论文网站制作软件有哪些,写论文用什么软件 ?  小程序网站制作需要准备什么资料,如何制作小程序?  济南专业网站制作公司,济南信息工程学校怎么样?  建站主机CVM配置优化、SEO策略与性能提升指南  建站之星安装步骤有哪些常见问题?  如何将凡科建站内容保存为本地文件?  建站主机选购指南:核心配置优化与品牌推荐方案  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  建站之星北京办公室:智能建站系统与小程序生成方案解析  外贸公司网站制作哪家好,maersk船公司官网?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  音乐网站服务器如何优化API响应速度?  如何在万网ECS上快速搭建专属网站?  如何通过FTP空间快速搭建安全高效网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何快速使用云服务器搭建个人网站?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  网站网页制作专业公司,怎样制作自己的网页?  如何选择服务器才能高效搭建专属网站?  设计网站制作公司有哪些,制作网页教程?  建站之星备案是否影响网站上线时间?  如何在搬瓦工VPS快速搭建网站?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  家庭服务器如何搭建个人网站?  如何在腾讯云服务器上快速搭建个人网站?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  javascript中的try catch异常捕获机制用法分析  建站168自助建站系统:快速模板定制与SEO优化指南  如何高效生成建站之星成品网站源码?  建站主机SSH密钥生成步骤及常见问题解答?  如何用美橙互联一键搭建多站合一网站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  活动邀请函制作网站有哪些,活动邀请函文案?  网站制作公司排行榜,抖音怎样做个人官方网站 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。

  • 返回顶部
  • 400-708-3566
  • QQ在线
  • 微信二维码