这是一套现代C++(目前是C++17)的核心指南,考虑了未来可能的增强和国际标准化组织技术规范(TSs)。 目的是帮助C++程序员编写更简单、更高效、更易维护的代码。
导论摘要:
In.target: Target readershipIn.aims: AimsIn.not: Non-aimsIn.force: EnforcementIn.struct: The structure of this documentIn.sec: Major sections所有C++程序员。这包括可能会考虑c的程序员。
本文的目的是帮助开发人员采用现代C++(目前是C++17),并实现更统一的跨代码库风格。
我们不会妄想这些规则中的每一条都可以有效地应用于每个代码库. 升级旧系统很难. 然而,我们确信,使用规则的程序比不使用规则的程序更不容易出错,也更容易维护。 通常,规则会使开发的初始阶段更快、更容易。 就我们所知,这些规则使代码的性能与采用旧的、更传统的技术的代码一样好或更好;这些规则会遵循零开销原则 (即"你无需为不用的东西付费" 或者说 “当您恰当地使用抽象机制时, 您至少可以获得与使用低级语言结构手工编码一样好的性能”).
将这些规则的思想用于新代码,同时在处理旧代码时找机会利用它们,并尽可能接近这些思想。 Remember:
花点时间去理解一份指导原则对你的程序的影响。 这些指南是根据“超集子集”原则设计的 (Stroustrup05). 他们并不是简单地定义要使用的C++子集 ((可靠性、安全性、性能或其他). 而是, 强烈建议使用一些简单的“扩展”,这些“扩展”使得C++最容易出错的特性的使用变得多余,从而可以被禁止(在我们的规则集中)。
这些规则以静态类型安全和资源安全为重点. 因此,它们强调范围检查、避免对“nullptr”解引用、避免悬空指针以及系统地使用异常(通过RAII)的可能性。 为了实现这一点,同时也为了最大限度地减少作为错误来源的晦涩代码,规则还强调简单性,以及在明确指定的接口后面隐藏必要的复杂性。
许多规则是规定性的。(Many of the rules are prescriptive.) 我们对简单地说“不要那样做”而又没有提供替代方案的规则感到不安。
这样做的一个后果是,一些规则只能由启发式检查来支持,而不是精确的和机械的可验证的检查来支持。 其他规则阐明了一般原则. 越是通用的规则,就越是有更加详细和特定的规则提供部分检查。
这些指导方针致力于C++的核心及其使用。 我们预计,大多数大型组织、特定应用领域,甚至大型项目都需要进一步的规则,可能还需要进一步的限制,以及进一步的库支持。 例如,硬实时程序员通常不能自由使用自由存储(动态内存),并且在选择库时会受到限制。 我们鼓励制定更具体的规则,作为这些核心规则的补充。 构建您理想的小型基础库并使用它,而不是将您的编程水平降低到貌似优美的汇编代码。
这些规则旨在允许[逐步采用](# S-现代化)。
一些规则旨在增加各种形式的安全,而其他规则旨在减少事故的可能性,还有很多是兼顾两者的。旨在防止事故的规则通常会禁止完全合法的C++。然而,当有两种方式表达一个想法时,其中一种方式被证明是一个常见的错误来源,而另一种方式不是,我们会试图引导程序员使用后者。