C++11 核心新特性详解
C++ 标准从 1998 年的 C++98 到 2011 年的 C++11,经历了一次里程碑式的更新。这次迭代不仅修复了早期版本的诸多缺陷,更引入了大量革命性特性,从根本上改变了编程范式,让代码更简洁、高效且安全。
本文将聚焦 C++11 的核心新增内容,从统一列表初始化、auto/decltype/nullptr 的声明优化,到 STL 容器扩展,再到右值引用、移动语义和完美转发等底层机制,系统梳理这些特性的设计逻辑与实际应用场景。
统一的列表初始化
C++11 扩大了大括号 {} 的使用范围,使其可用于所有内置类型和用户自定义类型。初始化时可选加等号 =,也可以省略。
int y = {2};
int y{2};
列表初始化同样适用于 new 表达式中,但日常开发中建议谨慎使用,确保能理解其背后的隐式转换规则。
initializer_list 类型
当使用 auto 初始化列表 {...} 时,编译器会优先推导出 std::initializer_list<T> 类型。一般容器的构造函数和赋值操作符都支持这种类型。
vector<int> v1 = {1, 2, 3, 4, 3};
Point p1 = {1, 1};
这里要注意区分:v1 的初始化调用了 initializer_list 的构造函数,而 p1 涉及多参数构造函数的隐式类型转换,两者规则不同。
当 {1, 2, 3, 4, 3} 转换成 initializer_list 时,编译器会在常量区自动创建一个隐藏的常量数组,initializer_list 只是用指针引用这个数组,而不是自己存储数据。因此,手动模拟实现这个类型比较困难,通常依赖编译器特殊处理。
声明优化
C++11 在声明方面增加了 auto、nullptr 和 decltype。
nullptr vs NULL
NULL 有时被定义为 0 或 (void*)0,既能表示指针也能表示整型,容易引发歧义。nullptr 是专门用于空指针的关键字,类型安全更高。
// 推荐
int* ptr = nullptr;
// 不推荐
int* ptr = NULL;
宏定义如 #define NULL ((void*)0) 在现代 C++ 中应尽量避免,推荐使用 const、enum 或 inline 替代。



