是否缺少必需的包含未定义行为?

时间:2020-04-20 16:35:05

标签: c++ include language-lawyer undefined-behavior

在我写对How is it possible to use pow without including cmath library的答案时,我担心已经证明缺少必需的标头的包含实际上是未定义的行为,但是由于我没有发现对此事实的任何同意,因此我想提出正式的问题:

缺少必需的标题,即

#include <iostream>

int main()
{
    std::cout << std::pow(10, 2);
}
  1. 格式错误([defns.ill.formed])的代码?
  2. 调用未定义的行为([defns.undefined])?
  3. 如果它不是1和2,是未指定的行为[defns.unspecified]还是实现定义的行为[defns.impl.defined]?
  4. 如果不为1,即该代码格式正确,那会不会与[using.headers]和[intro.compliance]“接受并正确执行格式正确的程序”相矛盾?

就像在我的answer中一样,我倾向于肯定两个问题,但是由于Difference between Undefined Behavior and Ill-formed, no diagnostic message required,[using.headers]非常令人困惑。正如[defns.well.formed]表示构造到ODR的程序格式正确,并且存在规范,例如每当iostream不能定义pow时,有人可能会说这仍未指定行为([defns.unspecified])。对于这样一个重要的问题,我不想仅仅依靠我的标准口译技能来给出明确的答案。请注意,如果代码是UB,也不会问这个问题,那么被接受的唯一答案就是不回答。

1 个答案:

答案 0 :(得分:2)

未指定是该程序的格式正确还是格式错误(带有必需的诊断信息,因为找不到名称{{1}})。可能的说法来自一个C ++头文件may include another的声明,该头文件为实现授予权限以便对该程序仅提供两种可能的解释。

几个相似的规则(例如,一个模板必须至少具有一个有效的潜在特化规范)(例如)被描述为使程序格式不正确,不需要诊断,但是在这种情况下,自由不会扩展到实现(可以说是更可取的)。也就是说,实现 允许以任意的方式处理格式不正确的程序,只要它发出至少一个诊断消息即可,因此对它进行分组并不是完全不合理的即使症状在实践中有所不同,这种情况仍具有真正的不确定行为。

相关问题