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

解析之C++的列表初始化语法

聚合初始化先从std::array的内部实现说起。为了让std::array表现得像原生数组C中的std::array与其他STL容器有很大区别——std::array没有定义任何构造函数而且所有内部数据成员都是public的。这使得std::array成为一个聚合aggregate。对聚合的定义在每个C版本中有少许的区别这里简单总结下C17中定义一个class或struct类型当它满足以下条件时称为一个聚合[1]没有private或protected数据成员没有用户提供的构造函数但是显式使用default或delete声明的构造函数除外没有virtual、private或者protected基类没有虚函数直观的看聚合常常对应着只包含数据的struct类型即常说的POD类型。另外原生数组类型也都是聚合。聚合初始化可以用大括号列表。一般大括号内的元素与聚合的元素一一对应并且大括号的嵌套也和聚合类型嵌套关系一致。在C语言中我们常见到这样的struct初始化语句。解了上面的原理就容易理解为什么std::array的初始化在多一层大括号时可以成功了——因为std::array内部的唯一元素是一个原生数组所以有两层嵌套关系。下面展示一个自定义的MyArray类型它的数据结构和std::array几乎一样初始化方法也类似12345678910111213141516structS {intx;inty;};templatetypenameT,size_tNstructMyArray {T data[N];};intmain(){MyArrayint, 3 a1{{1, 2, 3}};// 两层大括号MyArrayS, 3 a2{{{1, 2}, {3, 4}, {5, 6}}};// 三层大括号return0;}在上面例子中初始化列表的最外层大括号对应着MyArray之后一层的大括号对应着数据成员data再之后才是data中的元素。大括号的嵌套与类型间的嵌套完全一致。这才是std::array严格、完整的初始化大括号写法。可是为什么当std::array元素类型是简单类型时省掉一层大括号也没问题——这就涉及聚合初始化的另一个特点大括号省略。大括号省略brace elisionC允许在聚合的内部成员仍然是聚合时省掉一层或多层大括号。当有大括号被省略时编译器会按照内层聚合所含的元素个数进行依次填充。下面的代码虽然不常见但是是合法的。虽然二维数组初始化只用了一层大括号但因为大括号省略特性编译器会依次用所有元素填充内层数组——上一个填满后再填下一个。1inta[3][2]{1, 2, 3, 4, 5, 6};// 等同于{{1, 2}, {3, 4}, {5, 6}}知道了大括号省略后就知道std::array初始化只用一层大括号的原理了由于std::array的内部成员数组是一个聚合当编译器看到{1,2,3}这样的列表时会挨个把大括号内的元素填充给内部数组的元素。甚至假设std::array内部有两个数组的话它还会在填完上一个数组后依次填下一个。这也解释了为什么省掉内层大括号复杂类型也可以编译成功1std::arrayS, 3 a3{1, 2, 3, 4, 5, 6};// 内层不加括号编译成功因为S也是个聚合类型所以这里省略了两层大括号。编译期按照下面的顺序依次填充元素数组0号元素的S::x、数组0号元素的S::y、数组1号元素的S::x、数组1号元素的S::y……虽然大括号可以省略但是一旦用户显式的写出了大括号那么必须要和这一层的元素个数严格对应。因此下面的写法会报错1std::arrayS, 3 a1{{1, 2}, {3, 4}, {5, 6}};// 编译失败编译器认为{1,2}对应std::array的内部数组然后{3,4}对应std::array的下一个内部成员。可是std::array只有一个数据成员于是报错too many initializers for std::arrayS, 3需要注意的是大括号省略只对聚合类型有效。如果S有个自定义的构造函数省掉大括号就行不通了1234567891011121314151617181920212223242526// 聚合structS1 {S1() default;intx;inty;};std::arrayS1, 3 a1{1, 2, 3, 4, 5, 6};// OK// 聚合structS2 {S2() delete;intx;inty;};std::arrayS2, 3 a2{1, 2, 3, 4, 5, 6};// OK// 非聚合有用户提供的构造函数structS3 {S3() {};intx;inty;};std::arrayS3, 3 a3{1, 2, 3, 4, 5, 6};// 编译失败这里可以看出default的构造函数与空构造函数的微妙区别。std::initializer_list的另一个故事上面讲的所有规则都只对聚合初始化有效。如果我们给MyArray类型加上一个接受std::initializer_list的构造函数情况又不一样了123456789101112131415161718192021structS {intx;inty;};templatetypenameT,size_tNstructMyArray {public:MyArray(std::initializer_listT l){std::copy(l.begin(), l.end(), std::begin(data));}T data[N];};intmain(){MyArrayS, 3 a{{{1, 2}, {3, 4}, {5, 6}}};// OKMyArrayS, 3 b{{1, 2}, {3, 4}, {5, 6}};// 同样OKreturn0;}当使用std::initializer_list的构造函数来初始化时无论初始化列表外层是一层还是两层大括号都能初始化成功而且a和b的内容完全一样。这又是为什么难道std::initializer_list也支持大括号省略这里要提一件趣事《Effective Modern C》这本书在讲解对象初始化方法时举了这么一个例子[2]12345678910111213classWidget {public:Widget();// default ctorWidget(std::initializer_listint il);// std::initializer_list ctor…// no implicit conversion funcs};Widget w1;// calls default ctorWidget w2{};// also calls default ctorWidget w3();// most vexing parse! declares a function!Widget w4({});// calls std::initializer_list ctor with empty listWidget w5{{}};// ditto -注意然而书里这段代码最后一行w5的注释却是个技术错误。这个w5的构造函数调用时并非像w4那样传入一个空的std::initializer_list而是传入包含了一个元素的std::initializer_list。即使像Scott Meyers这样的C大牛都会在大括号的语义上搞错可见C的相关规则充满着陷阱

相关文章:

解析之C++的列表初始化语法

聚合初始化先从std::array的内部实现说起。为了让std::array表现得像原生数组,C中的std::array与其他STL容器有很大区别——std::array没有定义任何构造函数,而且所有内部数据成员都是public的。这使得std::array成为一个聚合(aggregate&…...

FakeLocation:Android应用级虚拟定位完全指南

FakeLocation:Android应用级虚拟定位完全指南 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 在Android开发测试和隐私保护领域,精准的位置模拟一直是一个…...

Fast-GitHub终极指南:一键解决国内GitHub访问慢的免费浏览器插件

Fast-GitHub终极指南:一键解决国内GitHub访问慢的免费浏览器插件 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 对于国…...

Hermes Agent 源代码解析(一):根目录探秘,看懂 AI 代理的「公司级」架构设计

目录 Hermes Agent 源代码解析(一):根目录探秘,看懂 AI 代理的「公司级」架构设计 一、先搞懂:Hermes Agent 到底是什么? 二、可视化总览:Hermes Agent 公司架构图 三、根目录全解析&#x…...

OpenClaw 保姆级教程:你要知道的都在这里了!

指令替换 项目需求:将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一,测试代码示例 test.c // test.c #includ…...

从审批流到组织架构:用AntV X6 1.x 在Vue里打造一个可交互的业务图表

从审批流到组织架构:用AntV X6 1.x 在Vue里打造可交互的业务图表 当我们需要在后台管理系统中实现复杂的业务流程可视化时,简单的静态图表往往难以满足需求。AntV X6作为专业的图编辑引擎,配合Vue框架,能够帮助我们构建出既美观又…...

YOLO26-seg分割优化:注意力魔改 | SimAM(无参Attention),一种轻量级的自注意力机制,效果秒杀CBAM、SE

💡💡💡SimAM是一种轻量级的自注意力机制,其网络结构与Transformer类似,但是在计算注意力权重时使用的是线性层而不是点积 💡💡💡本文改进:分别加入到YOLO26的backbone、neck、detect,助力涨点 改进1结构图: 改进2结构图: 改进3结构图:...

如何在Blender中导入MMD模型:MMD Tools插件完整教程

如何在Blender中导入MMD模型:MMD Tools插件完整教程 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools 如果…...

biliTickerBuy项目中的HTTP 429错误处理优化:3大策略提升抢票成功率

biliTickerBuy项目中的HTTP 429错误处理优化:3大策略提升抢票成功率 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 在B站会员购抢票工具biliTickerBuy中,HTTP 429错误处…...

如果临近上线,你的组员说有风险,你作为组长应该怎么处理

一、第一时间先稳住,别慌也别压不让组员不敢说话不让团队陷入情绪对立让组员同步完整信息:问题复现步骤、影响范围(全量 / 部分用户、核心流程 / 边缘功能)问题严重级别:崩溃 / 资损 / 流程阻断 / UI 小问题根因初步判…...

论文阅读:ICLR 2026 A Guardrail for Safety Preservation: When Safety-Sensitive Subspace Meets Harmful-Res

总目录 大模型安全研究论文整理 2026年版:https://blog.csdn.net/WhiffeYF/article/details/159047894 https://openreview.net/forum?id887vde4ZAW https://openreview.net/pdf?id887vde4ZAW A Guardrail for Safety Preservation: When Safety-Sensitive Sub…...

Microchip PIC64GX:64位RISC-V多核微处理器解析与应用

1. Microchip PIC64GX:首款64位RISC-V多核微处理器深度解析当Microchip宣布推出PIC64GX系列时,整个嵌入式行业都为之一振。作为Microchip首款64位RISC-V架构的微处理器,PIC64GX不仅填补了该公司在高性能RISC-V处理器领域的空白,更…...

终极指南:如何在Windows上轻松玩转经典Flash游戏与存档管理

终极指南:如何在Windows上轻松玩转经典Flash游戏与存档管理 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 你是否怀念那些曾经风靡一时的Flash游戏?当现代浏览器纷…...

LeetCode 接雨水:python 题解

1. 智能软件工程的范式转移:从库集成到原生框架演进 在生成式人工智能(Generative AI)从单纯的文本生成向具备自主规划与执行能力的“代理化(Agentic)”系统跨越的过程中,.NET 生态系统正在经历一场自该平台…...

XUnity.AutoTranslator完整教程:3步实现Unity游戏实时翻译

XUnity.AutoTranslator完整教程:3步实现Unity游戏实时翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因为语言障碍而无法畅玩心仪的日系RPG或欧美独立游戏?XUnity.Au…...

从‘孔径不够’到‘合成来凑’:聊聊SAR模型背后的工程智慧与那些年我们踩过的坑

从‘孔径不够’到‘合成来凑’:SAR模型背后的工程智慧与实战陷阱 雷达技术的发展史就是一部人类突破物理限制的史诗。上世纪50年代,当工程师们面对"要获得3米分辨率需要数十公里天线孔径"这一不可能任务时,合成孔径雷达&#xff08…...

Code The Hidden Language of Computer Hardware and Software 学习:CPU 控制信号电路详解

概述 这8张图描述了一个简单8位CPU的控制逻辑电路,负责在不同机器周期(取指、PC自增、执行)中,按正确时序产生各种控制信号,驱动寄存器、RAM、ALU等部件协同工作。 一、机器周期的基本结构 CPU每执行一条指令&#xff…...

99.26%降AI达标率+9平台覆盖:嘎嘎降AI 4.8元单价怎么做到的?

挑降 AI 工具的时候很多同学最关心的是"达标率"——但市面上号称"高达标率"的工具不少,真正公开具体数据并能解释数据来源的不多。 嘎嘎降AI 公开的 99.26% 达标率是这次推荐的核心数据之一。这个数字不是营销话术——是基于超过十亿字符真实处…...

知网AIGC算法升级让你的降AI工具失效?嘎嘎降AI 7天免费再处理!

很多同学买完降 AI 工具就以为万事大吉了,但 2026 年毕业季有一个被忽略的真实风险——算法升级带来的"昨天 OK 今天突然超标"。 嘎嘎降AI 的售后保障里有一条很少有工具提供的政策——7 天内 AIGC 检测平台算法升级导致 AI 率变化也能免费再处理。这条政…...

赌不起场景买降AI率工具看什么?比话降AI 3+1保障实际损失为零!

赌不起场景是降 AI 工具市场上最特殊的需求——你的论文不能延毕、不能错过答辩、不能学位审核翻车。这种场景下选工具的逻辑跟普通场景完全不同。 普通场景看单价、效果、口碑就够了。赌不起场景看的是翻车场景下的真实损失——万一工具不达标你能承受多大的成本?…...

从气象预测到金融风控:交叉小波相干性分析在Matlab中的跨界应用实战

从气象预测到金融风控:交叉小波相干性分析在Matlab中的跨界应用实战 当环境科学家试图理解厄尔尼诺现象如何影响区域降雨模式,或是金融分析师需要预测不同资产类别的联动周期时,他们面临的共同挑战是:传统统计方法难以捕捉随时间变…...

手把手教你用Python调参:让LSTM和ARIMA在时间序列预测里“各司其职”(基于PyTorch和pmdarima)

时间序列预测实战:LSTM与ARIMA融合调参全流程解析 时间序列预测一直是数据分析领域的核心挑战之一。无论是金融市场的波动预测、能源消耗的趋势分析,还是电商平台的销售预估,精准的时间序列模型都能为决策提供关键支持。传统统计方法如ARIMA擅…...

DLSS Swapper完全指南:3分钟免费提升游戏画质与性能的终极方案

DLSS Swapper完全指南:3分钟免费提升游戏画质与性能的终极方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾在4K分辨率下游戏时,明明显卡性能足够,画面却依然模糊卡顿&am…...

目标检测YOLOv5前,别忘了用OpenCV给图像做个‘光照SPA’:预处理实战

目标检测YOLOv5前,别忘了用OpenCV给图像做个‘光照SPA’:预处理实战 在计算机视觉的实际工程中,我们常常过于关注模型架构的优化,却忽略了输入数据质量对最终性能的决定性影响。想象一下,即便是最先进的YOLOv5模型&…...

告别JSON臃肿:用Apache Avro为你的Kafka或Hudi数据瘦身(附实战代码)

告别JSON臃肿:用Apache Avro为你的Kafka或Hudi数据瘦身(附实战代码) 最近在优化数据管道时,发现JSON格式的数据体积膨胀得厉害——每条记录都要重复字段名,网络传输和磁盘存储的成本高得吓人。更糟的是,序列…...

基于Netty与WebSocket构建高性能物联网推送服务:从原理到实践

1. 项目概述与核心价值最近在折腾一个物联网项目,需要从一堆传感器节点里高效地收集数据。传统的轮询方式在节点数量上去之后,延迟和服务器压力都成了大问题。就在我琢磨着怎么优化架构时,偶然发现了 GitHub 上一个名为 “Caryyon/antenna” …...

Go语言WebSocket实时聊天后端架构设计与实现指南

1. 项目概述:一个轻量级的实时聊天应用后端 最近在折腾一个需要实时通信功能的小项目,不想用那些大而全的解决方案,感觉太重了,维护成本也高。于是就在开源社区里翻找,发现了 donapart/klatsch 这个项目。光看名字 “…...

终极碧蓝航线自动化脚本:Alas如何24小时解放你的双手 [特殊字符]

终极碧蓝航线自动化脚本:Alas如何24小时解放你的双手 🚢 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript …...

如何快速获取百度网盘提取码:baidupankey终极使用指南

如何快速获取百度网盘提取码:baidupankey终极使用指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘提取码而反复搜索浪费时间吗?baidupankey作为一款专业的百度网盘提取码智能获取工具…...

技术访问者的操作扩展与元素分离

技术访问者的操作扩展与元素分离:提升交互效率的新思路 在当今数字化时代,技术访问者(如自动化脚本、爬虫或API调用者)与网页元素的交互方式直接影响效率与稳定性。传统方法往往依赖固定的DOM结构,一旦页面布局变动&a…...