在C++标准中,当违反"shall"要求时,规定了什么?
In the C++ standard, what is specified to occur when a "shall" requirement is violated?
例如,著名的词语(§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"要求会使程序病态。诊断问题已经在其他地方得到了解答。
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我在c++代码中生成了一个运行时#3异常
- Ardunio UNO解决了多个重叠的定时器循环
- 为什么我的代码在输出中增加了93天
- C++为什么尽管我调用了void函数,它却不起作用
- 不断收到相同的错误...怎么了?C++
- 首要问题的答案让值班员搞错了
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 我在二维向量中是否正确分配了内存
- clang整洁10忽略了我的NOLINT命令
- MPI突然停止了对多个核心的操作
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 有了gcc,是否可以链接库,但前提是它存在
- C++11 标准中的哪一部分规定了基元数据类型大小之间的相对顺序?
- 为什么OpenGL告诉我我已经使用了GL_STATIC_DRAW,而我另有规定?
- 在C++标准中,当违反"shall"要求时,规定了什么?
- c++标准是否规定了如何将该指针传递给成员函数?