gcc 允许未初始化的 constexpr
Uninitialized constexpr allowed with gcc
给定代码
int main()
{
constexpr int n;
return 0;
}
、-fpermissive
的 g++ 只发出警告,而 clang++,也有 -fpermissive
,出错,抱怨 const 类型对象的默认初始化 'const int'。现在,我相信 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 中只有语言扩展被降级为警告状态。如果不是语言扩展(如给定的例子),则不会降级为警告,会被诊断为错误。
给定代码
int main()
{
constexpr int n;
return 0;
}
、-fpermissive
的 g++ 只发出警告,而 clang++,也有 -fpermissive
,出错,抱怨 const 类型对象的默认初始化 'const int'。现在,我相信 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 中只有语言扩展被降级为警告状态。如果不是语言扩展(如给定的例子),则不会降级为警告,会被诊断为错误。