作为 用户托尼 指出 C ++标准的第1.3.12段中有一个[注

允许的不确定的行为范围从完全忽略情况以不可预测的结果忽略情况,到在翻译或计划执行过程中以记录的环境特征进行行为...

这是否与UB的定义相矛盾,说 ...这个国际标准没有任何要求?我的意思是他们说“无要求”,然后在同一段落中说“允许的UB”。

应该如何解释此注释?它确实以任何方式限制了UB吗?

有帮助吗?

解决方案

摘自第6.5.1节 第3部分 ISO/IEC指令:

在标准文本中集成的注释和示例仅应用于提供旨在帮助理解或使用标准的其他信息,并且不得包含必须符合的规定,以便能够要求遵守该标准标准。

因此,它完全是非规范性的(无约束力),只是为了澄清。

其他提示

由于注释不是规范性的,因此不会以任何方式限制UB。这只是一个澄清,即实施可以使用一些正式导致UB作为记录的扩展的构造,尽管任何依赖这样一个细节的程序当然都是本质上不能安全地携带于其他环境。

本说明正在解释实施情况,如果它遇到没有确定行为的代码,则可能会做什么。 “允许”一词并非旨在限制,而是给出一些共同行为的例子。

有趣的是,编译器几乎总是必须编译一些东西!考虑这个代码片段:

void f() { 1 / 0; }

翻译人员在遇到此事时的行为不是很好的定义,但它不能只是做任何喜欢的事情!实际上,如果是编译器,仍然需要编译此编译单元。那是因为包含此功能的程序的行为仍然可以很好地定义!编译器不知道该功能是否被调用。实际上,这个问题出现在函数为“ main()”且控制肯定会流过零部门的位置,结果是,即使该程序也不允许拒绝编译器。原因是:该程序仍表现良好,并且需要一个符合的编译器来接受所有形成良好的程序(并拒绝所有不正确的程序并发出诊断错误消息,除非另有说明)。

这不能轻易地使其形成不良,因为很难确切地指定如何需要如何进行智能编译器来检测何时必须进行零分配。

因此,有趣的是,标准的主张“不强大要求”实际上非常接近错误。它是支持单独汇编的汇编系统的特征 必需的 无论如何都要编译某些东西,因为它不能推断出 程序 具有不确定的行为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top