gcc允许使用未初始化的constexpr

时间:2019-05-07 07:49:06

标签: c++ g++ clang++

给出代码

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。

1 个答案:

答案 0 :(得分:2)

该标准主要涉及诊断,而不涉及错误或警告。因此,合格的编译器需要发出的所有诊断信息都是这两个编译器的工作。

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

根据GCC

  

-fpermissive

     

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

Clang最初没有-fpermissive选项。它是后来添加的。根据我们在线获得的信息,Clang's approach的这一选项是:

  

-fpermissive

     

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

因此在Clang中,仅语言扩展名被降级为警告状态。如果它不是语言扩展(如在给定的示例中那样),它将不会降级为警告,并且会被诊断为错误。