【问题标题】:Uninitialized constexpr allowed with gccgcc 允许未初始化的 constexpr
【发布时间】:2019-05-07 16:31:35
【问题描述】:

给定代码

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 通常会将错误转化为警告。这个问题似乎适得其反。
  • 我明白你在说什么,但是由于clang++ 发出错误,即使使用-fpermissive,我认为一个编译器在这方面比另一个更宽松。如果我正确阅读标准,那应该是一个错误。
  • 使用-fpermissive,您明确地告诉编译器您希望快速轻松地使用标准规则。当你明确告诉它“嘿,相信我;不要遵守规则”时,你不能指望编译器遵守规则

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


【解决方案1】:

该标准主要处理诊断,而不是错误或警告。因此,符合要求的编译器所需要发出的只是这两个编译器所做的诊断。

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

根据GCC

-fpermissive

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

Clang 最初没有 -fpermissive 选项。它是后来添加的。从我们网上的资料来看,Clang's approach这个选项是:

-fpermissive

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

所以在 Clang 中,只有语言扩展被降级为警告状态。如果它不是语言扩展(如给定示例中),则不会降级为警告,并将被诊断为错误。

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多