给出代码
int main()
{
constexpr int n;
return 0;
}
,带有-fpermissive
的g ++,仅发出警告,而带有-fpermissive
的clang ++,则出错,抱怨const类型为'const int'的对象的默认初始化。现在,我相信clang ++的行为是正确的。问题是我是否缺少某些东西,也许g ++不发出错误是可以接受的。版本:clang ++ 7.0.1,g ++ 8.3.1,Fedora 29,amd64。
答案 0 :(得分:2)
该标准主要涉及诊断,而不涉及错误或警告。因此,合格的编译器需要发出的所有诊断信息都是这两个编译器的工作。
在这种情况下,为什么-fpermissive
在GCC中仅产生警告,但是Clang中的错误取决于这些编译器针对-fpermissive
选项采取的方法。
根据GCC:
-fpermissive
将有关不合格代码的某些诊断从错误降级为警告。因此,使用
-fpermissive
允许编译一些不合格的代码。
Clang最初没有-fpermissive
选项。它是后来添加的。根据我们在线获得的信息,Clang's approach的这一选项是:
-fpermissive
不要在语言扩展上出错。使用已知的诊断无效代码 当前语言模式下的语言扩展最多降级为 警告。
因此在Clang中,仅语言扩展名被降级为警告状态。如果它不是语言扩展(如在给定的示例中那样),它将不会降级为警告,并且会被诊断为错误。