Vin*_*ent 1 c++ standards well-formed language-lawyer
C++ 标准定义well-formed programs为
根据语法规则、可诊断语义规则和一定义规则构造的C++程序
我想知道是否所有格式良好的程序都能编译(如果不是这样,什么类型的错误会导致格式良好的程序和可编译问题之间存在差异)。例如,包含歧义错误的程序会被认为是格式良好的吗?
一个结构良好的程序可以有未定义的行为。
它在注释中,因此在技术上不具有权威性,但似乎有意终止编译(或标准所称的“翻译”)在可能的 UB 范围内:
[介绍.defs]
未定义的行为
本文档没有强加任何要求的
行为 [注意:当本文档省略任何明确的行为定义或程序使用错误的构造或错误的数据时,可能会出现未定义的行为。允许的未定义行为范围从完全忽略情况并产生不可预测的结果,在翻译或程序执行期间以环境特征的文件化方式(有或没有发布诊断消息),到终止翻译或执行(通过发布诊断消息)。
许多错误的程序结构不会产生未定义的行为;他们需要被诊断。
常量表达式的计算永远不会表现出在本文档 ([expr.const]) 的 [intro] 至 [cpp] 中明确指定为未定义的行为。— 尾注 ]
还有实际的实施限制:
[实现]
因为计算机是有限的,所以 C++ 实现不可避免地受限于它们可以成功处理的程序的大小。
每个实施都应记录那些已知的限制。该文档可能会引用存在的固定限制,说明如何根据可用资源计算可变限制,或者说固定限制不存在或未知。
此外,编译器可能有错误,也确实有错误。格式良好仅意味着符合标准的编译器应该编译它(在上述限制范围内)。有缺陷的编译器不一定符合标准。
最后,标准文档本身并不完美。如果对规则的含义存在分歧,则程序可能在一种解释下格式良好,而在另一种解释下格式不正确。
如果编译器不同意程序员或其他编译器,那么它可能无法编译对方认为格式良好的程序。
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |