在C++标准中,当违反"shall"要求时,指定要发生什么?

Bri*_*ian 20 c++ language-lawyer

例如,着名的单词(§3.2/ 1)

任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义.

除非另有说明,否则我认为"必须"的要求应被解释为"除非程序形成不良".然而,其他人则声称"应"代表"否则行为未定义".

在每种情况下,我都会遇到标准,其中"必须"要求后面没有"行为未定义"或"无需诊断"之类的内容,其中发生的规则显然是可以诊断的规则.由我所知的所有编译器诊断出来(以上段落就是一个例子).这就是为什么我认为这意味着"否则程序形成不良",需要诊断.

无论如何,那些只是我的想法.我很欣赏一个权威的答案.

Jer*_*fin 15

是的,为了形成良好,该计划必须遵循您在问题中引用的一个定义规则(§1.3.26):

良好的计划

C++程序根据语法规则,可诊断语义规则和单定义规则(3.2)构建.

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

1.4实施合规[intro.compliance]

1可诊断规则集包含本国际标准中的所有句法和语义规则,但那些包含"无需诊断"的明确表示法或描述为"未定义行为"的规则除外
.2虽然本国际标准规定只有C++实现的要求,如果这些要求被表达为对程序,程序的一部分或程序的执行的要求,那么这些要求通常更容易理解.这些要求具有以下含义:
-如果程序不包含任何违反本标准的规定,一个符合标准的实现应在其资源的限度内,接受并正确执行2该程序.
- 如果程序包含违反任何可诊断规则或在本标准中描述为"有条件支持"的构造的发生,当实现不支持该构造时,符合要求的实现应发出至少一条诊断消息.
- 如果某个程序包含违反不需要诊断的规则,则本国际标准不对该程序的实施提出任何要求.
[强调补充]

是的,如第二个要点中所述,如果违反了可诊断规则,则需要进行诊断.


Tem*_*Rex 6

除了@JerryCoffin 的回答,还有ISO/IEC Directives Part 2(管理所有 ISO/IEC 文件,包括 C++ 标准),特别是附件 H用于表达规定的口头形式

表H.1所示的文字形式用于表示为符合文件要求而严格遵守的要求,不得偏离。

  • 是,
  • 是必需的,以,
  • 要求,
  • 不得不,
  • 只有……被允许,
  • 有必要

不得

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

因此,违反“应”要求会使程序格式错误。诊断问题已在别处得到解答。