C++11 概览
C++11:此常见问题解答部分的目的
此常见问题解答的 C++11 部分(包括本节)的目的是
- 概述 C++11 在 ISO C++ 标准的先前版本之外提供的新功能(语言特性和标准库)。
- 提供 ISO C++ 标准化工作的目标概览。
- 呈现用户视角的新功能
- 提供参考文献以便对功能进行更深入的研究。
- 列出许多贡献者(主要是为委员会编写报告的作者)。标准并非由一个匿名组织编写。
我们经常借鉴提案中的示例。在这种情况下:感谢提案作者。许多其他示例借鉴自 Stroustrup 的演讲和论文。
请注意,本常见问题解答的目的不是提供对单个功能的全面讨论或对其使用方法的详细解释。目的是提供简单的示例来演示 C++11 所能提供的内容(以及参考文献)。我们的理想是“每个功能最多一页”,无论功能多么复杂。详细信息通常可以在参考文献中找到。
请参阅常见问题解答主页以获取所有 C++11 章节的列表。
什么是 C++11?
C++11 是 ISO C++ 标准,于 2011 年 8 月以 21-0 的国家投票正式批准。这份公共工作文件是 2012 年 1 月的工作草案,包含 C++11 标准以及次要的编辑修订。
C++11 是对 C++98/03 的重大升级,具有性能和便利功能,使其感觉像一门新语言。
之前的(也是第一个)标准通常被称为 C++98 或 C++03;C++98 和 C++03 之间的差异非常少且技术性强,不应引起用户的关注。本常见问题解答讨论 C++98/C++03 到 C++11 之间的变化。
什么是 C++0x?
C++11 的“开发中”名称。在 2011 年正式批准之前,当时正在开发中的标准被非官方地称为 C++0x,因为它曾希望在 C++08 或 C++09 完成。将“x
”视为十六进制(即 C++0B
== C++11)。
编译器何时会实现 C++11?
目前正在发布的编译器(例如 GCC C++、Clang C++、IBM C++ 和 Microsoft C++)已经实现 C++11 的大部分或全部功能,并且正在开发 C++14 功能。
除了 Bug 之外,第一个完全符合 C++11 语言规范的实现是 GCC 4.8.1(2013 年 5 月 31 日),但它仍然没有符合规范的标准库。第一个完整的 C++11 实现,包括语言和标准库,是 Clang 3.3(2013 年 6 月 5 日)。
以下是供应商提供的 C++11 信息链接
委员会如何为 C++11 选择新的语言和库特性?
你不能仅仅通过添加每个人都认为是好主意的每个特性来改进一门语言。事实上,大多数现代语言的几乎每个特性都有人建议用于 C++:试着想象一下 C99、C#、Java、Haskell、Lisp、Python 和 Ada 的并集会是什么样子。为了使问题更加困难,请记住,即使在委员会同意它们是糟糕的情况下,也很难消除旧特性:经验表明,用户会迫使每个实现者在兼容性开关下(或默认情况下)提供已弃用和禁止的特性数十年。
除了一般设计目标之外,为了尝试从大量的建议中理性选择,委员会设计了一组具体的设计目标。结果是一种具有极大改进的抽象机制的语言。与手工制作的专用代码相比,C++ 能够优雅、灵活且零成本地表达的抽象范围大大增加。当我们说“抽象”时,人们通常只想到“类”或“对象”。C++11 远不止于此:通过添加诸如初始化列表、统一初始化、模板别名、右值引用、默认和删除函数以及可变参数模板等功能,可以清晰安全地表达的用户定义类型范围有所增长。它们的实现通过诸如auto、继承构造函数和decltype等功能得到简化。这些增强足以让 C++11 感觉像一门新语言。
有关已接受的语言功能的信息,请参阅本 FAQ 的 C++11 语言扩展部分,这些部分列在 FAQ 主页上。
标准库定义已经占标准规范文本的约 70%(这还不包括通过引用包含的 C 标准库)。尽管有些成员希望看到更多的标准库,但没有人可以说库工作组一直很懒惰。值得注意的是,C++98 库通过使用新的语言功能(例如初始化列表、右值引用、可变参数模板、noexcept
和constexpr
)得到了显著改进。C++11 标准库比 C++98 更易于使用并提供更好的性能。
有关已接受的库功能的信息,请参阅本 FAQ 的 C++11 库扩展部分,这些部分列在 FAQ 主页上。
C++11 的总体设计目标是什么?
C++从一开始就是一种通用编程语言,倾向于系统编程,它
C++11 的总体目标是加强这一点
- 使 C++ 成为更好的系统编程和库构建语言——也就是说,直接在 C++ 对编程的贡献上进行构建,而不是为特定子社区(例如数值计算或 Windows 风格的应用程序开发)提供专用设施。
- 通过增加统一性、更强的保证以及支持新手的功能(新手总是比专家多),使 C++ 更容易教授和学习。
- 当然,这是在非常严格的兼容性约束下完成的。委员会极少愿意破坏符合标准的现有代码,尽管在引入新关键字(例如
static_assert
、nullptr
和constexpr
)时会这样做。
更多详情请参阅
- B. Stroustrup:《什么是 C++11?》。CVu。第 21 卷,第 4 期和第 5 期。2009 年。
- B. Stroustrup:《在真实世界中演进语言:C++ 1991-2006》。ACM HOPL-III。2007 年 6 月。
- B. Stroustrup:《C++ 历史:1979-1991》。ACM 编程语言历史会议 (HOPL-2) 会议录。1993 年 3 月。
- B. Stroustrup:《C 和 C++:兄弟》。C/C++ 用户杂志。2002 年 7 月。
哪些具体设计目标指导了委员会?
当然,参与标准化工作的不同个人和组织有着或多或少不同的目标,尤其是在细节和优先级方面。而且,详细的目标会随时间而变化。请记住,委员会甚至无法完成所有人都同意的好事——它由资源非常有限的志愿者组成。然而,以下是一组在讨论哪些特性和库适合 C++11 时实际使用的标准:
- 保持稳定性和兼容性——不要破坏旧代码,如果绝对必须破坏,也不要悄无声息地破坏。
- 优先选择库而不是语言扩展——委员会在这方面并不完全成功;委员会内外有太多人偏爱“真正的语言特性”。
- 优先选择通用性而不是专业性——专注于改进抽象机制(类、模板等)。
- 同时支持专家和新手——新手可以通过更好的库和更通用的规则得到帮助;专家需要通用且高效的特性。
- 提高类型安全——主要通过允许程序员避免类型不安全的功能来实现。
- 提高性能并直接与硬件交互——使 C++ 更适合嵌入式系统编程和高性能计算。
- 融入现实世界——考虑工具链、实现成本、迁移问题、ABI 问题、教学和学习等。
请注意,整合功能(新的和旧的)以使其协同工作是关键——也是大部分工作。整体远大于其各部分简单的总和。
另一种看待详细目标的方式是查看使用领域和使用方式
- 机器模型和并发——为使用现代硬件(例如多核和弱一致性内存模型)提供更强的保证和更好的设施。例如线程、期物、线程局部存储和原子操作。
- 泛型编程——泛型编程是 C++98 取得巨大成功的故事之一;我们需要根据经验改进对其的支持。例如auto和模板别名。
- 系统编程——改进对接近硬件编程(例如低级嵌入式系统编程)和效率的支持。例如
constexpr
、std::array
和广义 POD。 - 库构建——消除抽象机制的限制、低效和不规则性。例如
inline namespace
、继承构造函数和右值引用。
我可以在哪里找到 C++11 特性的委员会论文?
访问委员会论文档案,主要关注 2005 年到 2011 年初的文档。在那里您很可能会被细节淹没。寻找“问题列表”和“状态”(例如,演进状态(2008 年 7 月))列表。当时活跃的关键小组是
- 核心工作组 (CWG) – 处理语言技术问题和规范
- 演进工作组 (EWG) – 处理语言特性提案和跨越语言/库边界的问题
- 库工作组 (LWG) – 处理库功能提案
我可以在哪里找到关于 C++11 的学术和技术论文?
这是一个不完整的列表。要提出添加或更正建议,请使用此常见问题解答标题上的“建议”图标(当然,您可以在任何常见问题解答上这样做)。
- Bjarne Stroustrup: 基础设施软件开发. Computer, vol. 45, no. 1, pp. 47-58, Jan. 2012, doi:10.1109/MC.2011.353. 这里有一段视频采访关于该论文和一段关于非常相似主题的演讲视频(这是一场 90 分钟的演讲,包括问答环节)。
- Saeed Amrollahi: 新千年的现代编程:C++0x 突出特征的技术调查。Computer Report (Gozaresh-e Computer), No.199, 2011 年 11 月(波斯历 1390 年 Mehr 和 Aban 月),第 60-82 页。(波斯语)
- Mark Batty 等人:C++ 并发数学化,POPL 2012。// 彻底、精确且数学化。
- Gabriel Dos Reis 和 Bjarne Stroustrup:《系统编程语言的通用常量表达式》。SAC-2010。第 25 届 ACM 应用计算专题讨论会。
- Hans-J. Boehm 和 Sarita V. Adve:《C++ 并发内存模型基础》。ACM PLDI'08。
- Hans-J. Boehm:《线程基础》。HPL 技术报告 2009-259 // “每个程序员都应该了解的内存模型问题”
- Douglas Gregor, Jaakko Jarvi, Jeremy Siek, Bjarne Stroustrup, Gabriel Dos Reis, and Andrew Lumsdaine:《概念:C++ 中泛型编程的语言支持》。OOPSLA'06,2006 年 10 月。// 2006 年的概念设计和实现;此后有所改进,尽管不足以使其在 C++11 中保留,目前正在为未来的 C++ 标准进行研究。
- Douglas Gregor 和 Jaakko Jarvi:《C++0x 的可变参数模板》。《面向对象技术杂志》,7(2):31-51,2008 年 2 月。
- Jaakko Jarvi 和 John Freeman:《C++0x 的 Lambda 函数》。ACM SAC ‘08。
- M. Paterno 和 W. E. Brown:《改进标准 C++ 以适应物理学界》。CHEP’04。// 此后许多方面都得到了改进!
- Michael Spertus 和 Hans J. Boehm:《C++0X 中垃圾回收的现状》。ACM ISMM’09。
- Verity Stob: 一个漫不经心的程序员的 C++ 新手指南——提高标准。The Register。2009 年 5 月。(幽默(我希望如此))。
- [N1781=05-0041] Bjarne Stroustrup:《C++0x 设计经验法则》。
- Bjarne Stroustrup:《在真实世界中演进语言:C++ 1991-2006》。ACM HOPL-III。2007 年 6 月。(包括幻灯片和视频)。// 涵盖了 C++0x 的设计目标、标准化过程以及截至 2007 年的进展。
- B. Stroustrup:《什么是 C++0x?》。CVu。第 21 卷,第 4 期和第 5 期。2009 年。
- Anthony Williams: C++0x 中更简单的多线程编程。devx.com。
我还能在哪里阅读 C++11?
随着大多数 C++ 实现提供新的语言特性和库,关于 C++11 的信息量正在增加。以下是简短的资源列表
- B. Stroustrup:《C++ 编程语言(第四版)》。
- B. Stroustrup:《C++ 之旅》。
- 委员会论文档案.
- C++11 标准(最接近的公共近似值)
- C++11 维基百科条目。这似乎在积极维护,但显然不是委员会成员维护的。
- C++11 功能支持列表.
是否有关于 C++11 的视频?
是的
- B. Stroustrup、H. Sutter、H-J. Boehm、A. Alexandrescu、S.T.Lavavej、Chandler Carruth 和 Andrew Sutton:来自2012 年 GoingNative 会议的几场演讲和小组讨论。
- B. Stroustrup、H. Sutter、S. Meyers、A. Alexandrescu、S.T.Lavavej、Chandler Carruth、S. Parent 和 M. Wong:来自2013 年 GoingNative 会议的几场演讲和小组讨论。
- Herb Sutter:《编写现代 C++ 代码:C++ 多年来如何演变》。2011 年 9 月。
- Herb Sutter: 为什么选择 C++?。C++ and Beyond 2011,2011 年 8 月。
- Herb Sutter:《(不是你父亲的) C++》。Lang.NEXT,2012 年 4 月。
- Herb Sutter:《原子武器:C++ 内存模型与现代硬件,第一部分》,第二部分,幻灯片,摘自《C++ and Beyond》,2012 年 8 月。
- Lawrence Crowl: Lawrence Crowl 谈 C++ 线程。在 Sophia Antipolis,2008 年 6 月。
- Bjarne Stroustrup:《C++0x 的设计》。滑铁卢大学,2007 年。
- Bjarne Stroustrup:《初始化》。谷歌,2007 年。
- Bjarne Stroustrup:《C++0x 概述》。在 Sophia Antipolis,2008 年 6 月。
- Lawrence Crowl: 线程。
- Roger Orr: C++0x。2008 年 1 月。
- Hans-J. Boehm:《正确使用 C++ 线程》。2007 年 12 月。
C++11 难学吗?
C++11 使 C++ 比以往任何时候都更容易学习,并且与 C++98/03 几乎完美兼容。
对于从未接触过 C++ 的人来说,C++11 比以前的语言版本更容易学习。尽管功能更多,但你编写的代码往往更简单,许多以前很难或晦涩的东西现在不再是了。(当然,和任何通用语言一样,仍然有一些困难或晦涩的部分。)事实上,Stroustrup 现在用一本简洁的 180 页书籍《C++ 之旅》涵盖了整个 C++11 语言和库的精髓。
如果你了解 C++98/03,你的所有代码几乎都能继续原封不动地工作,因为 C++11 与旧标准几乎完美向后兼容。然而,当你学习新特性时,你会发现它们通常会使你的代码更简单(例如,auto
)、更清晰(例如,模板别名而不是 typedef
)、更强大和富有表现力(例如,lambda 函数),并且比以往任何时候都快(例如,右值引用和移动语义通常只需使用 C++11 编译器重新编译你的现有 C++ 代码,就能使其更快!)。额外的简洁和清晰真正让 C++11 感觉像一门全新的语言。
显然,C++11 比 C++98 更大,功能更多。那么它怎么会更容易学习呢?在设计 C++11 时,委员会使用了几种简化工具(从学习者的角度来看),包括:
- 通用化:在某些情况下,C++11 用一个更通用的规则取代了例如三条规则(例如,统一初始化、继承构造函数和线程)。它还消除了特殊情况,因此需要学习的东西更少(例如,
vector<vector<int>>
现在完全合法,无需在>>
之间放置空格)。所有这些都减少了“概念计数”或需要死记硬背的东西的数量;例如,一个有三个例外或特殊情况的规则有四件需要记住的东西,而两条通用规则可以以所有组合方式协同工作,则只需要记住两件东西,但通常可以表达比一条带三个特殊情况的规则更多的内容。 - 更简单的替代方案:在其他情况下,C++11 提供了比旧替代方案更易于使用的新功能(例如,
std::array
、auto、范围 for 语句和正则表达式)。
警告:那些坚持“自下而上”教学 C++ 的人(首先是边缘情况,首先是 C 子集等等)将抵消任何此类优势,并使语言显得晦涩难懂。这是不必要或不可取的。我们终于得到了更好的自上而下教学 C++ 的材料,特别是 Stroustrup 的《C++ 之旅》。如果你看到有人自下而上学习 C++,请尽快引导他们到《C++ 之旅》和类似材料。
C++11 是最终的 C++ 标准吗?
不是。即将发布的下一个 C++ 国际标准被称为C++14,预计将于 2014 年发布,截至撰写本文时,它已接近最终确定。委员会还在努力发布 2014 年及以后的大量技术规范,涵盖从文件系统和网络等底层库到并发和并行以及概念等主题,等等。预计其中许多技术规范将成为下一个主要的 C++ 国际标准的一部分,目前预计在 2017 年左右。
有关最新详情,请参阅当前状态页面。