C++11
C++11(ISO/IEC 14882:2011)是 C++ 历史上最具里程碑意义的版本,被称为"现代 C++"的起点。它在语言和标准库两个层面都带来了根本性的变革。
核心变革
语言层面
| 特性 | 意义 |
|---|---|
auto 类型推导 | 减少冗余的类型声明 |
| 右值引用与移动语义 | 消除不必要的深拷贝,大幅提升性能 |
| Lambda 表达式 | 一等公民的闭包,简化 STL 算法使用 |
| 可变参数模板 | 类型安全的变参函数,enable_if 等元编程基石 |
constexpr | 编译期计算能力的起点 |
nullptr | 类型安全的空指针常量 |
enum class | 作用域枚举,消除隐式转换 |
static_assert | 编译期断言 |
| 委托构造函数 | 构造函数复用 |
| 用户定义字面量 | 自定义 operator"" 语法糖 |
| Range-based for | 简洁的容器遍历语法 |
标准库层面
| 组件 | 意义 |
|---|---|
unique_ptr / shared_ptr / weak_ptr | 取代 auto_ptr,正确的资源所有权语义 |
std::thread / std::mutex / std::atomic | 首次标准化多线程支持 |
std::array | 固定大小数组,替代 C 风格数组 |
std::tuple | 异构容器 |
<chrono> | 类型安全的时间库 |
<regex> | 正则表达式 |
<random> | 高质量随机数 |
std::function | 类型擦除的通用可调用对象封装 |
std::reference_wrapper | 可拷贝的引用包装器 |
std::initializer_list | 列表初始化支持 |
std::begin / std::end | 统一遍历接口,支持数组和容器 |
std::ratio | 编译期有理数算术 |
| 无序容器 | unordered_map、unordered_set |
为什么是分水岭
C++11 之前的 C++(C++98/03)和 C++11 之后的 C++ 在写法风格上有本质差异:
- 移动语义改变了值传递的经济学——按值返回不再昂贵
- Lambda 使算法优先于手写循环成为可能
auto使迭代器和模板返回值不再是噩梦- 并发从"平台相关"变成了"语言保证"
编译器支持
| 编译器 | 完整支持版本 |
|---|---|
| GCC | 4.8.1+ |
| Clang | 3.3+ |
| MSVC | VS 2015 (19.0)+ |
延伸阅读
从左侧侧边栏选择具体特性开始阅读,或直接从 auto 类型推导 开始。