在我写对How is it possible to use pow without including cmath library的答案时,我担心已经证明缺少必需的标头的包含实际上是未定义的行为,但是由于我没有发现对此事实的任何同意,因此我想提出正式的问题:
缺少必需的标题,即
#include <iostream>
int main()
{
std::cout << std::pow(10, 2);
}
就像在我的answer中一样,我倾向于肯定两个问题,但是由于Difference between Undefined Behavior and Ill-formed, no diagnostic message required,[using.headers]非常令人困惑。正如[defns.well.formed]表示构造到ODR的程序格式正确,并且存在规范,例如每当iostream
不能定义pow
时,有人可能会说这仍未指定行为([defns.unspecified])。对于这样一个重要的问题,我不想仅仅依靠我的标准口译技能来给出明确的答案。请注意,如果代码是UB,也不会问这个问题,那么被接受的唯一答案就是不回答。
答案 0 :(得分:2)
未指定是该程序的格式正确还是格式错误(带有必需的诊断信息,因为找不到名称{{1}})。可能的说法来自一个C ++头文件may include another的声明,该头文件为实现授予权限以便对该程序仅提供两种可能的解释。
几个相似的规则(例如,一个模板必须至少具有一个有效的潜在特化规范)(例如)被描述为使程序格式不正确,不需要诊断,但是在这种情况下,自由不会扩展到实现(可以说是更可取的)。也就是说,实现 允许以任意的方式处理格式不正确的程序,只要它发出至少一个诊断消息即可,因此对它进行分组并不是完全不合理的即使症状在实践中有所不同,这种情况仍具有真正的不确定行为。