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

范围for 和 万能引用

万能引用(Universal Reference)

条件

  • T&& 中的 T 需要被模板参数推导(即 T 是模板类型参数或 auto)。

  • 形式

    • 在 函数模板参数 中:template <typename T> void foo(T&& arg)

    • 在 auto&& 声明中:auto&& x = ...

特点

  • 可以绑定到 左值或右值

  • 通常用于 完美转发(std::forward

范围for

for (auto x : container) {//这里X是容器的元素// 循环体
}上面会被替换成下面
{auto&& __range = container;          // 获取容器引用auto __begin = __range.begin();      // 获取起始迭代器auto __end = __range.end();          // 获取结束迭代器for (; __begin != __end; ++__begin) { // 遍历auto x = *__begin;               // 解引用获取当前元素// 循环体}
}如果是 左值容器(如变量),推导为 左值引用(Container&),避免拷贝。如果是 右值容器(如临时对象),推导为 右值引用(Container&&),延长临时对象生命周期至循环结束。也就是说,范围for的条件是
1.容器必须提供 begin() 和 end() 方法,返回迭代器2.定义迭代器类,并实现:operator*(解引用)operator++(递增)operator!=(比较)如果容器是数组,那迭代器其实就是指针
1.__begin 和 __end 就是指针,因为数组名在大多数情况下会退化为首元素指针。2.指针本身支持 *(解引用)、++(移动到下一个元素)、!=(比较地址),因此完全符合迭代器的要求。X使用引用类型
for (auto& x : container) {// 循环体
}{auto&& __range = container;          // 获取容器引用auto __begin = __range.begin();      // 获取起始迭代器auto __end = __range.end();          // 获取结束迭代器for (; __begin != __end; ++__begin) { // 遍历auto& x = *__begin;               // 解引用获取当前元素// 循环体}
}auto默认是丢弃引用的,如果返回的容器的元素需要引用类型的话,要在for里使用auto&

相关文章:

  • 8.进程概念(四)
  • 【java WEB】恢复补充说明
  • 权限提升—Linux提权内核溢出漏洞辅助项目
  • 《AIStarter安装部署全攻略:AI绘画/数字人项目快速上手指南(含Windows环境配置要点)》
  • python库文件查找详解
  • (33)VTK C++开发示例 ---图片转3D
  • 系统思考:企业效率提升关键
  • TensorRt10学习第一章
  • 数据结构-树(二叉树、红黑、B、B+等)
  • Sentry 异常捕获
  • 【数据分享】2020年中国高精度森林覆盖数据集(免费获取)
  • QMK机械键盘固件开发指南:从源码到实践
  • ffmpeg 元数据
  • Python 常用内置函数详解(七):dir()函数——获取当前本地作用域中的名称列表或对象的有效属性列表
  • stm32数码管显示数字/循环
  • 【Redis】Another Redis Desktop Manager 安装指南
  • podman/docker国内可用的docker镜像源(2025-05)
  • Linux btop 使用教程
  • Wireshark抓取SMTP协议报文
  • 如何提升自我执行力?
  • 乘客被困停滞车厢超4小时,哈尔滨铁路局客服:列车晚点,表示歉意
  • 新势力4月销量出炉:零跑逾4万辆再夺冠,蔚来环比增近六成,小米下滑
  • 人民日报评论员:因势利导对经济布局进行调整优化
  • 近七成科创板公司2024年营收增长,285家营收创历史新高
  • 共绘“彩色上海”,IP SH艺术共创沙龙首期圆满举办
  • 体重管理门诊来了,瘦不下来的我们有救了?|健康有方FM