c++ - gcc 允许未初始化的 constexpr

标签 c++ g++ clang++

给定代码

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

,g++,带有 -fpermissive,只发出警告,而 clang++,也带有 -fpermissive,出错,提示 const 类型对象的默认初始化'常量整数'。现在,我相信 clang++ 的行为是正确的。问题是我是否遗漏了什么,也许 g++ 不发出错误是可以接受的。版本:clang++ 7.0.1、g++ 8.3.1、Fedora 29、amd64。

最佳答案

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

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

根据 GCC :

-fpermissive

Downgrade some diagnostics about nonconformant code from errors to warnings. Thus, using -fpermissive allows some nonconforming code to compile.

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

-fpermissive

Do not error on language extensions. Diagnostics for invalid code using known language extensions in the current language mode are downgraded to at most a warning.

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

关于c++ - gcc 允许未初始化的 constexpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56017882/

相关文章:

c++ - 函数模板特化生成链接错误

使用抽象接口(interface)的 C++ 编译器独立 DLL

c++ - 纯抽象基类的虚拟析构函数

c++ - CLANG vs. GNU Compilers Collection - 在 GNU 中编译但在 CLANG 中失败

python - 创建类的实例并传递给 C++ 代码

c++ - 如何使用 C++ 保存网页? Windows或Linux系统

macos - R包安装在所有机器上成功,但一台

c++ - SFINAE:检测成员变量的存在在 g++ 上不起作用

c++ - 可以使用 Clang AST 打印带有名称的函数指针的 QualType 吗?

c++ - Visual Studio 2008 : how to save project properties as a property sheet to be used in other projects