在C++标准中,当违反"shall"要求时,规定了什么?

In the C++ standard, what is specified to occur when a "shall" requirement is violated?

本文关键字:规定了 shall 什么 标准 C++      更新时间:2023-10-16

例如,著名的词语(§3.2/1)

任何翻译单元不得包含任何变量、函数、类类型、枚举的一个以上定义类型,或模板

我认为除非另有说明,否则"应该"需求应该被解释为好像它们后面隐含地跟着"否则程序是病态的"。然而,另一些人则认为"应当"的意思是"否则行为是不明确的"。

在我在标准中遇到的每个情况中,"应该"要求后面没有像"否则行为是未定义的"或"不需要诊断"这样的东西,它发生的规则是一个明显可诊断的规则,并且被我所知道的所有编译器诊断(上面的段落是一个例子)。这就是为什么我认为它的意思是"否则程序是病态的",即,需要进行诊断。

不管怎样,这些只是我的想法。我希望你能给我一个权威的回答。

是的,要格式良好,程序必须遵循您在问题(§1.3.26)中引用的单一定义规则:

格式良好的程序

根据语法规则、可诊断的语义规则和一次定义规则(3.2)构造的c++程序。

其他可诊断规则指定为(§1.4):



1可诊断规则集由本国际标准中的所有语法和语义规则组成对于那些包含显式符号"不需要诊断"或被描述为导致"未定义行为"的规则。
虽然本国际标准只陈述了对c++实现的要求,但如果将这些要求表述为对程序、程序的一部分或程序的执行的要求,这些要求通常更容易理解。这些要求有以下含义:
-如果程序不包含违反本标准规则的内容,符合标准的实施应在其资源限制内接受并正确执行2该程序。- 如果程序违反了任何可诊断规则,或者出现了本标准中描述为"有条件支持"的结构,而实现不支持该结构,符合标准的实现应发出至少一条诊断消息。
-如果一个程序违反了不需要诊断的规则,本国际标准对该程序的实现不做任何要求。[粗体字另加]

是的,正如第二个要点所指出的,如果违反了可诊断规则,则需要进行诊断。

除了@JerryCoffin的回答,还有ISO/IEC指令第2部分(管理所有ISO/IEC文件,包括c++标准),特别是附件H 条款表达的口头形式

应使用表H.1所示的口头形式来表示严格遵守要求,才能符合要求不允许偏离的文件。

:

  • 表示
  • 必须,
  • 只允许…

不得:

  • 不允许[允许][可接受][允许],
  • 必须不是
  • 要求…不是
  • 不能是

因此,违反"shall"要求会使程序病态。诊断问题已经在其他地方得到了解答。