什么是 C++11?
2011年8月12日,ISO(国际标准化组织)批准了 C++ 的新版本,称为 C++11。C++11 为 C++ 语言增加了一整套新功能!使用这些新功能完全是可选的——但您无疑会发现其中一些很有帮助。之前的教程都已更新为符合 C++11 标准。
C++11 的目标和设计
Bjarne Stroustrup 将 C++11 的目标概括如下
- 在 C++ 的优势基础上构建——而不是试图将 C++ 扩展到它可能较弱的新领域(例如,具有大量 GUI 的 Windows 应用程序),而是专注于使其在擅长的事情上做得更好。
- 使 C++ 更易于学习、使用和教授——提供使语言更一致、更易于使用的功能。
为此,制定该语言的委员会试图遵守以下一般原则
- 尽可能保持与旧版本 C++ 和 C 的稳定性和兼容性。在 C++03 下工作的程序通常应该在 C++11 下仍然可以工作。
- 将核心语言扩展的数量降至最低,并将大部分更改放在标准库中(此版本未能很好地实现此目标)
- 专注于改进抽象机制(类、模板),而不是添加用于处理特定狭窄情况的机制。
- 为新手和专家添加新功能。每个人都能得到一些东西!
- 提高类型安全性,以防止意外错误。
- 提高性能并允许 C++ 直接与硬件交互。
- 考虑可用性和生态系统问题。C++ 需要与其他工具良好地协作,易于使用和教授等……
C++11 在主题上与 C++03 没有太大区别,但它确实增加了大量新功能。
C++11 中的主要新功能
为了您的兴趣,这里列出了 C++11 增加的主要功能。请注意,此列表并非全面,而是旨在突出一些关键的有趣功能。
- auto(10.8 — 使用 auto 关键字的对象类型推导)
- char16_t 和 char32_t 以及支持它们的新字面量(暂无教程)
- constexpr(5.1 — 常量变量(命名常量))
- decltype(在16.7 — 数组、循环和符号挑战解决方案中提及)
- default 说明符(14.11 — 默认构造函数和默认参数)
- 委托构造函数(14.12 — 委托构造函数)
- delete 说明符(11.4 — 删除函数)
- 枚举类(13.6 — 作用域枚举(枚举类))
- extern 模板(暂无教程)
- Lambda 表达式(20.6 — Lambda 简介(匿名函数))和捕获(20.7 — Lambda 捕获)
- long long int(4.3 — 对象大小和 sizeof 运算符)
- 移动构造函数和赋值(22.3 — 移动构造函数和移动赋值)
- noexcept 说明符(在27.4 — 未捕获的异常和全捕获处理程序中简要提及)
- nullptr(12.8 — 空指针)
- override 和 final 说明符(25.3 — override 和 final 说明符,以及协变返回类型)
- 基于范围的 for 语句(16.8 — 基于范围的 for 循环(for-each))
- 右值引用(22.2 — 右值引用)
- static_assert(9.6 — Assert 和 static_assert)
- std::initializer_list(23.7 — std::initializer_list)
- 尾随返回类型语法(10.8 — 使用 auto 关键字的对象类型推导)
- 类型别名(10.7 — Typedefs 和类型别名)
- typedef 现在可以 typedef 模板类
- 统一初始化(4.1 — 基本数据类型简介)
- 用户定义字面量(暂无教程)
- 可变参数模板(暂无教程)
- 两个没有空格的 >> 符号现在将被正确解释为关闭一个模板对象
C++ 标准库中还有许多新的类可供使用。
- 更好地支持多线程和线程本地存储(暂无教程)
- 哈希表(暂无教程)
- 随机数生成改进(在8.14 — 使用 Mersenne Twister 生成随机数中有基本讨论)
- 引用包装器(25.9 — 对象切片)
- 正则表达式(暂无教程)
- std::auto_ptr 已弃用(22.1 — 智能指针和移动语义简介)
- std::tuple(暂无教程)
- std::unique_ptr(22.5 — std::unique_ptr)