C++11 概述
C++98 奠定了语言基础,而 2011 年发布的 C++11 标准则是一次里程碑式的更新。它不仅修复了早期版本的诸多缺陷,更引入了大量革命性特性,从根本上改变了 C++ 的编程范式,为开发者提供了更简洁、高效且安全的编码工具。
统一的列表初始化
C++11 扩大了大括号 {} 的使用范围,使其可用于所有内置类型和用户自定义类型。使用列表初始化时,可添加等号 =,也可省略。
int y = {2};
int y{2};
对于类对象,这支持多参数构造函数的隐式转换:
struct Point {
Point(int x, int y) : _x(x), _y(y) {}
int _x, _y;
};
Point p1 = {1, 1};
Point p2{1, 1};
// 等价于 Point p1(1, 1);
注意: 如果构造函数标记为 explicit,则禁止这种隐式转换。此外,在 new 表达式中也可以使用列表初始化:
Point* ptr3 = new Point[2]{{0, 0}, {1, 1}};
const Point& r = {3, 3}; // const 不能省略,因为创建的是临时对象
initializer_list
当 auto 用于初始化列表 {...} 时,编译器会优先推导出 std::initializer_list<T> 类型。一般容器的构造函数和赋值操作符都支持该类型。
vector<int> v1 = {1, 2, 3, 4, 3};
这里需要注意的是,{1, 2, 3, 4, 3} 转换成 initializer_list 时,编译器会在常量区自动创建一个隐藏的常量数组,initializer_list 只是用指针引用这个数组,而不是自己存储数据。因此,模拟实现该类型较为困难,通常依赖编译器支持。


