GCC允许允许非初始化的ConstexPR

Uninitialized constexpr allowed with gcc

本文关键字:ConstexPR 初始化 许允许 GCC      更新时间:2023-10-16

给定代码

int main()
{
    constexpr int n;
    return 0;
}

,g ,使用-fpermissive,仅发出警告,而clang 也带有-fpermissive,错误,抱怨const类型" const int"对象的默认初始化。现在,我相信Clang 的行为是正确的。问题是我是否缺少某些东西,也许G 不发出错误是可以接受的。版本:Clang 7.0.1,G 8.3.1,Fedora 29,AMD64。

该标准主要涉及诊断,而不是错误或警告。因此,要发射的所有符合编译器都需要所有这些编译器都这样做的诊断。

在这种情况下,为什么-fpermissive仅在GCC中发出警告,但是CLANG中的错误取决于这些编译器对-fpermissive选项所采取的方法。

根据GCC:

-fpermissive

将有关不合格代码的一些诊断从错误降低到警告。因此,使用-fpermissive允许一些不合格的代码编译。

首先没有-fpermissive选项。稍后添加。从我们在线的信息中,Clang对此选项的方法是:

-fpermissive

不要在语言扩展上出错。使用已知代码的无效代码诊断 当前语言模式中的语言扩展最多被降级为 警告。

因此,在clang中,只有语言扩展被降级为警告状态。如果不是语言扩展(如给定示例(,它将不会降级为警告,并且会被诊断为错误。