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

Is missing a required include undefined behavior?

当我给 写一个答案时,我害怕证明缺少包含所需的 header 实际上是未定义的行为,但由于我没有找到任何同意这一事实的人,我喜欢强加正式问题:

缺少必需的 header 即

#include <iostream>

int main()
{
    std::cout << std::pow(10, 2);
}
  1. Ill-formed ( [defns.ill.formed] ) 代码?
  2. 调用未定义的行为([defns.undefined])?
  3. 如果不是1和2,是未指定行为[defns.unspecified]还是implementation-defined行为[defns.impl.defined]?
  4. 如果不是 1,即如果此代码是 well-formed,那岂不是与 [using.headers] 和 [intro.compliance] "accept and correctly execute a well-formed program" 相矛盾?

就像我的 I tend to affirm both questions, but [using.headers] is very confusing because of Difference between Undefined Behavior and Ill-formed, no diagnostic message required 一样。由于 [defns.well.formed] 暗示为 ODR 构造的程序格式正确,并且有规范说明何时 iostream 不得定义 pow,有人可能会争辩说这仍然未指定行为([defns.unspecified])。对于这样一个重要的问题,我不想仅仅依靠我的标准解释技巧来获得明确的答案。请注意,如果代码是 UB,则接受的即唯一的其他答案不会回答,问题也不会问它。

未指定 该程序是格式正确还是格式错误(需要进行诊断,因为名称查找未找到 pow)。可能性来自于一个 C++ 头文件 may include another 的声明,它授予 权限 实现给这个程序两种可能的解释之一。

几个类似的规则(例如,模板必须至少有一个有效的潜在专业化)描述为使程序出错-formed,不需要诊断,但在这种情况下,自由不会扩展到实现(这可以说是更可取的)。也就是说,一个实现 允许以 任意 方式处理格式错误的程序,只要它发出至少一个诊断消息,所以将这种情况与真正的未定义行为归为一类并非完全不合理,即使症状在实践中有很大不同。