【问题标题】:Are notes and examples in the core language specification of the C++ Standard non-normative?C++ 标准的核心语言规范中的注释和示例是否非规范?
【发布时间】:2014-02-17 07:40:38
【问题描述】:

经常在 SO(和其他地方)上,我看到 C++ 标准中的注释和示例不是规范的说法 - 我自己可能已经多次提出这种说法。

但是,我在 C++ 标准的核心语言规范中找不到这一事实的证据(目前我正在查看 C++14 的 n3979 工作草案)。

我能找到的最接近的引述在第 17.5.1.2/2 段中:

标有“注释:”或“示例:”的段落是信息性的,其他段落是规范性的。

但是,除非我弄错了,否则该段仅适用于库部分(即第 18 至 30 条和附录 D)。

因此问题是:C++ 标准中的所有注释和示例都是非规范性的吗?脚注呢?

【问题讨论】:

    标签: c++ c++11 language-lawyer iso c++14


    【解决方案1】:

    请参阅ISO/IEC Directives Part 2 的第 6.5 节。注释、示例和脚注都被认为是“信息性的”,而不是“规范性的”。

    关于注释和示例:

    文档文本中集成的注释和示例仅用于提供 旨在帮助理解或使用文档的附加信息。他们应 不包含要求(“应”;见 3.3.1 和表 H.1)或任何考虑的信息 对文件的使用是必不可少的,例如指令(必要的;见表 H.1), 建议(“应该”;见 3.3.2 和表 H.2)或许可(“可能”;见表 H.3)。 注释可以写成事实陈述。

    对于脚注:

    文本的脚注提供了额外的信息;它们的使用应保持在最低限度。原样 正文中集成的注释和示例的案例(见 6.5.1)脚注不应包含 要求或任何被认为对使用该文件必不可少的信息。

    但是,请注意,图和表的脚注可以包含要求。

    【讨论】:

    • +1 用于引用规范性而非我引用的信息性文件。 @AndyProwl,请接受这个。
    • 这里给出的链接已经失效;在here 上有此文档的更新版本。它的结构完全不同(因此上面引用的部分不再逐字出现),但它说的基本相同。
    【解决方案2】:

    这是对所有ISO standard documents 通用的:

    一个集成在文档文本中的示例,用于给出 旨在帮助理解或使用 文件。在ISO标准中,例子无一例外 不规范。

    similar clause applies to notes:

    集成在文档文本中的注释,用于提供 旨在帮助理解或使用 文件。在 ISO 标准中,注释无一例外 不规范。

    【讨论】:

    • 大多数 ISO 文档都力求足够详细地描述“符合”对象的类别,以保证组合它们的效果,因此区分规范和非规范部分非常重要。然而,C 标准将允许人为的实现符合标准,但除了人为的和无用的程序之外,它不能运行任何东西,并且允许人为的程序严格符合,即使除了上述人为的实现之外,没有其他实现可以正确处理。
    • 鉴于标准中的上述两个主要限制,标准的规范部分和非规范部分之间会或应该有什么实际区别?如果标准不要求符合要求的实现能够运行任何有用的程序,那么任何有用的程序都必须对实现提出超出其需要支持的要求。
    • @supercat 我不同意您的观点,即该标准有两个主要限制,并且符合标准的实现永远不会有用。非规范部分是为了澄清,规范部分是规范的。其他任何事情都是实施质量的一部分。如果他们的实施“拖钓”规范,请向您的供应商投诉。
    • 您的意思是说,在实际可行时,不应特别期望质量实现符合非规范部分?
    • @supercat 区分规范和非规范部分非常重要:一个例子是脚注 95 (C11) 中允许的“类型双关”,然而,不会出现在标准的其他任何地方,对吧?然而,事实证明:“在 ISO 标准中,注释无一例外是非规范性的”。
    【解决方案3】:

    按照标准的编写方式,实现符合要求的所有条件是它能够处理至少一个(可能是人为的和无用的)程序。然而,要使任何实现对任何事物都真正有用,它必须超出标准给出的基本要求。

    虽然实现不需要以与要符合的示例一致的方式表现,但这样做的实现通常应该被认为优于那些不符合的实现。未能做到这一点的实现是否应被视为具有足够的质量以用于某些特定目的将取决于所讨论的目的和失败的原因。

    【讨论】: