当前位置: 首页 > news >正文

C++引用折叠

C++引用折叠详解

引用折叠(Reference Collapsing)是C++模板和类型推导中的一个重要规则,它决定了当引用被应用于引用时会发生什么情况。

引用折叠规则

在C++中,引用折叠遵循以下规则:

  1. T& &T&
  2. T& &&T&
  3. T&& &T&
  4. T&& &&T&&

简单来说,只要其中有一个是左值引用(&),结果就是左值引用;只有当两个都是右值引用(&&)时,结果才是右值引用。

为什么需要引用折叠

引用折叠主要出现在以下场景:

  1. 模板类型推导中
  2. typedefusing别名中
  3. decltype表达式中

示例

示例1:模板函数中的引用折叠

template<typename T>
void foo(T&& param) {  // 这里是万能引用(universal reference)// 根据传入参数类型,T会被推导为不同形式
}int main() {int x = 10;const int cx = 20;foo(x);   // T被推导为int&,参数类型为int& && → int&foo(cx);  // T被推导为const int&,参数类型为const int& && → const int&foo(30);  // T被推导为int,参数类型为int&&
}

示例2:类型别名中的引用折叠

template<typename T>
struct Widget {typedef T&& RvalueRef;
};int main() {Widget<int&>::RvalueRef r1;  // int& && → int&Widget<int&&>::RvalueRef r2; // int&& && → int&&
}

示例3:auto和decltype中的引用折叠

int main() {int x = 10;auto&& y = x;    // auto被推导为int&,y的类型是int& && → int&auto&& z = 42;   // auto被推导为int,z的类型是int&&decltype(x)&& a = 30;  // decltype(x)是int,a的类型是int&&decltype((x))&& b = x; // decltype((x))是int&,b的类型是int& && → int&
}

示例4:完美转发中的引用折叠

template<typename T>
void wrapper(T&& arg) {// 使用std::forward保持值的类别some_function(std::forward<T>(arg));
}void some_function(int& x) { std::cout << "lvalue\n"; }
void some_function(int&& x) { std::cout << "rvalue\n"; }int main() {int a = 10;wrapper(a);      // 输出"lvalue"wrapper(20);     // 输出"rvalue"const int b = 30;wrapper(b);      // 调用some_function(const int&)
}

总结

引用折叠是理解C++现代模板编程的关键概念之一,特别是在处理万能引用和完美转发时。记住引用折叠的四个规则,可以帮助你更好地理解模板类型推导和引用行为。

http://www.lryc.cn/news/595724.html

相关文章:

  • PHP与Web页面交互:从基础表单到AJAX实战
  • 【bug】ubuntu20.04 orin nx Temporary failure resolving ‘ports.ubuntu.com‘
  • 【测试开发】---Bug篇
  • Kafka监控体系搭建:基于Prometheus+JMX+Grafana的全方位性能观测方案
  • lspci/setpci用法小结
  • 《Webpack热更新瓶颈突破:全链路优化指南》
  • C++性能优化擂台技术文章大纲
  • web3.0怎么入局
  • MySql 运维性能优化
  • 前端项目启动后,只有localhost地址,没有ip地址
  • MoonBit Meetup 杭州站丨 探讨AI基础软件的精彩回顾
  • 面向对象分析与设计40讲(6)设计原则之开闭原则
  • pandas库的基本运用
  • 传统RNN模型
  • vcs门级仿真(后仿真)指南
  • Spring、Spring MVC、Spring Boot、Spring Cloud的联系和区别
  • 异构融合 4A:重构高性能计算与复杂场景分析的安全与效率边界
  • gpt面试题
  • MCP vs 传统集成方案:REST API、GraphQL、gRPC的终极对比
  • 深入浅出Proxy与Reflect:从“黑中介“到“数据管家“的进阶之路
  • OpenCV Mat UMat GpuMat Matx HostMem InputArray等设计哲学
  • 京东AI投资版图扩张:具身智能与GPU服务器重构科研新范式
  • 基于单片机智能药盒/智能药箱/定时吃药系统
  • PHP 文件上传
  • Python----大模型(基于Fastapi+streamlit的机器人对话)
  • 自研能管项目开发界面
  • 【Linux基础知识系列】第五十六篇 - 使用File命令识别文件类型
  • 记一次flink资源使用优化
  • Java内部类与Object类深度解析
  • 聊聊登录接口的混合加密:AES+RSA双剑合璧