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

C++ std::initializer_list 详解

std::initializer_list 是 C++11 引入的一个轻量级模板类,用于支持花括号初始化列表{1, 2, 3})的语义。它允许函数或构造函数接受任意长度的同类型初始化列表,是实现统一初始化({} 语法)的核心组件。


1. 基本特性

(1) 头文件

cpp

#include <initializer_list>

(2) 核心特点

  • 轻量级容器:只存储指向初始化列表元素的指针和长度,不拥有数据。

  • 常量性:元素是 const 的,不可修改。

  • 临时性:通常由编译器隐式构造,生命周期短暂(绑定到表达式结束)。

  • 支持范围 for 循环:可以遍历元素。


3. 底层实现原理

(1) 编译器隐式构造 initializer_list

当使用 {1, 2, 3} 初始化时,编译器会:

  1. 在栈或静态存储区创建一个临时数组 const T[N](如 const int[3])。

  2. 用 initializer_list 包装该数组的首地址和长度

  3. 传递给目标函数或构造函数。

(2) 示例:编译器生成的代码

cpp

// 用户编写的代码
std::vector<int> v = {1, 2, 3};// 编译器生成的伪代码
const int __temp_array[3] = {1, 2, 3};
std::vector<int> v(std::initializer_list<int>(__temp_array, 3));

(3) 内存模型

复制

下载

+-------------------+      +---------+
| initializer_list  |      | 临时数组  |
|-------------------|      |---------|
| _M_array (指针)   | ---> | 1       |
| _M_len (长度)     |      | 2       |
+-------------------+      | 3       |+---------+
  • initializer_list 不管理内存,仅引用临时数组。


4. 自定义类支持 initializer_list

(1) 定义构造函数

cpp

class MyContainer {std::vector<int> data;
public:MyContainer(std::initializer_list<int> init) : data(init) {std::cout << "Constructed with " << init.size() << " elements\n";}
};// 使用
MyContainer c = {1, 2, 3};  // 输出: Constructed with 3 elements

(2) 结合其他构造函数

注意重载优先级:

cpp

class Widget {
public:Widget(int a, int b);                   // (1)Widget(std::initializer_list<int> list); // (2)
};Widget w1(10, 20);   // 调用 (1)
Widget w2{10, 20};   // 调用 (2)!优先匹配 initializer_list
Widget w3{10};       // 调用 (2),而非 (1) 的隐式转换

5. 注意事项

(1) 窄化转换检查

{} 初始化会禁止窄化转换,但 initializer_list 本身不检查:

cpp

int x{3.14};  // 错误:窄化转换
std::vector<int> v{1, 2, 3.14}; // 错误:列表内禁止窄化
http://www.xdnf.cn/news/253621.html

相关文章:

  • 网工_UDP协议
  • NFS 快速开始
  • ppt设计美化公司_杰青_长江学者_优青_青年长江学者_万人计划青年拔尖人才答辩ppt模板
  • AE/PR插件 转场创建大师专业版 Transition Master Pro v2.0.2 Win+使用教程
  • tinycudann安装过程加ubuntu18.04gcc版本的升级(成功版!!!!)
  • 计算机网络01-网站数据传输过程
  • aws(学习笔记第四十课) image-content-search
  • [Linux]从零开始的STM32MP157 Buildroot根文件系统构建
  • 如何实现服务的自动扩缩容(Auto Scaling)
  • Kotlin Flow流
  • GZIPInputStream 类详解
  • Linux_sudo命令的使用与机制
  • 5.2刷题
  • libevent库详解:高性能异步IO的利器
  • python 常用web开发框架及使用示例
  • Python 在世界地图上加气泡图
  • 【多线程】六、基于阻塞队列的生产者消费者模型
  • react js 查看字体效果
  • MySQL 中的游标(Cursor)
  • NV162NV172美光固态颗粒NV175NV188
  • SpringBoot癌症患者交流平台设计开发
  • Flutter AppBar 详解
  • gRPC学习笔记记录以及整合gin开发
  • 【云备份】配置文件加载模块
  • 贝叶斯算法(Bayesian Algorithms)详解
  • DBeaver连接人大金仓数据库V9
  • Nginx搭建test服务器
  • 企业级分布式 MCP 方案
  • 文章六:《循环神经网络(RNN)与自然语言处理》
  • 第十六届蓝桥杯 2025 C/C++组 客流量上限