一、什么是 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 的稳定性和兼容性;在 C++03 下能正常工作的程序,一般也应在 C++11 下正常工作。
- 尽量控制核心语言扩展的数量,把大部分改动放入标准库(这一目标在本版本中并未完全实现)。
- 重点改进抽象机制(类、模板),而非为特定、狭窄场景增加机制。
- 为初学者与专家同时提供新功能——“人人有份”。
- 增强类型安全,防止无意中的缺陷。
- 提升性能,使 C++ 能够直接操作硬件。
- 考虑可用性与生态系统问题:C++ 需与其他工具良好协作,易于使用与教学,等等。
整体而言,C++11 并未在主题上与 C++03 分道扬镳,但它确实引入了海量新功能。
三、C++11 的主要新特性
为方便查阅,下面列出 C++11 引入的部分重要特性。此列表并非穷尽,仅用于凸显关键亮点:
auto
(参见 课程《使用 auto 关键字进行对象类型推导》)char16_t
与char32_t
及其新字面量(暂无教程)constexpr
(参见 课程《常量变量(具名常量)》)decltype
(在 课程《数组、循环与符号挑战解答》中提及)default
说明符(参见 课程《默认构造函数与默认实参》)- 委托构造函数(参见 课程《委托构造函数》)
delete
说明符(参见 课程《删除函数》)- 枚举类(enum class)(参见 课程《作用域枚举(enum class)》)
extern
模板(暂无教程)- Lambda 表达式(参见 课程《Lambda(匿名函数)简介》)及其捕获(参见 课程《Lambda 捕获》)
long long int
(参见 课程《对象大小与 sizeof 运算符》)- 移动构造函数与移动赋值(参见 课程《移动构造函数与移动赋值》)
noexcept
说明符(在 课程《未捕获异常与全捕获处理器》中简要提及)nullptr
(参见 课程《空指针》)override
与final
说明符(参见 课程《override 与 final 说明符及协变返回类型》)- 基于范围的 for 语句(参见 课程《基于范围的 for 循环(for-each)》)
- 右值引用(参见 课程《右值引用》)
static_assert
(参见 课程《assert 与 static_assert》)std::initializer_list
(参见 课程《std::initializer_list》)- 尾置返回类型语法(参见 课程《使用 auto 关键字进行对象类型推导》)
- 类型别名(参见 课程《typedef 与类型别名》)
typedef
现可为模板类创建别名- 统一初始化(参见 课程《基本数据类型简介》)
- 用户定义字面量(暂无教程)
- 可变参数模板(暂无教程)
- 连续两个
>>
若无空格,现可正确解析为模板结束符号
此外,C++ 标准库新增了大量新类,包括:
- 更完善的多线程支持与线程局部存储(暂无教程)
- 哈希表(暂无教程)
- 随机数生成改进(基本讨论见 课程《使用 Mersenne Twister 生成随机数》)
- 引用包装器(参见《对象切片》)
- 正则表达式(暂无教程)
std::auto_ptr
已被弃用(参见 课程《智能指针与移动语义简介》)std::tuple
(暂无教程)std::unique_ptr
(参见课程《std::unique_ptr》)