GCC允许允许非初始化的ConstexPR
Uninitialized constexpr allowed with gcc
给定代码
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中,只有语言扩展被降级为警告状态。如果不是语言扩展(如给定示例(,它将不会降级为警告,并且会被诊断为错误。
相关文章:
- 多成员Constexpr结构初始化
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 使用 std::分配器在 constexpr 中进行默认初始化
- C++:初始化 constexpr 构造函数中的成员数组
- 初始化模板化类中的静态 constexpr 成员
- 在 constexpr 构造函数中初始化数组是否合法?
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 静态 constexpr 成员变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 使用 constexpr 初始化 std.array 中的对象
- 类中的静态 constexpr 初始化链
- 错误!Constexpr变量必须通过常数表达式constexpr初始化
- 如果明确默认的constexpr ctor允许非constexpr初始化
- 使用 constexpr 初始化非常量静态字符串
- 全局变量的constexpr初始化
- constexpr初始化数组
- 如何将模板大小的数组初始化转换为 constexpr 初始化
- 在编译时使用constexpr初始化指向成员函数的指针数组
- 当从静态constexpr初始化向量时,C++未知类型