dav*_*idA 4 c++ aggregate-initialization c++17 c++20
C++20 引入了对指定初始值设定项的支持。
在 g++ with 中-std=c++17,可以使用指定的初始值设定项,只要您不遗漏任何初始值设定项,它将编译而不会出现任何错误或警告:
struct Foo {
int a;
float b;
};
Foo f {
.a = 7,
.b = 42.1f,
};
Run Code Online (Sandbox Code Playgroud)
然而,如果我启用-Wpedantic(并且-Werror)C++17 编译器会输出:
error: C++ designated initializers only available with '-std=c++20' or '-std=gnu++20' [-Werror=pedantic]
Run Code Online (Sandbox Code Playgroud)
但似乎没有一种方法可以在不禁用的情况下禁用或抑制此错误-Wpedantic,这对我来说太粗糙了。
我发现这非常令人困惑,因为在 C++17 中使用此功能时没有发出警告 - 使用它的代码将编译并运行,看似具有未定义的行为,但从我在网上找到的所有内容来看,不应该使用它使用 C++17。
那么,为什么在不 使用 C++17 的情况下使用此不受支持的功能时不会出现警告或错误呢-Wpedantic?如果它在技术上是 UB 的,那么警告用户不支持的语言功能肯定不是迂腐的吗?如果不是 UB,那么它就可以工作,对吗?
-Wpedantic最后,如果我选择在 C++17 代码中使用指定的初始值设定项,那么在不重新编译 g++ 的情况下,如何欺骗编译器接受而不生成此类警告?
我会根据彼得的有用评论自己回答这个问题:
“[我的]理解是落后的。C++17 根本不支持指定的初始化程序,但 g++(和其他编译器)在最终接受标准化过程之前包含了对功能的实验/临时支持。由于开发人员的历史游说(来自比如说,他们的 PAY 与“编译时不发出警告”等指标相关联)现代编译器默认情况下不会诊断非标准功能,而是使用
-pedanticDIRECTS 编译器来诊断它们。您的选择是 (1) 编译为 C+ +20 (2) 不使用-pedantic或 (3) 不使用指定的初始化器。”
彼得给出了一个可靠的答案,解释了我的错误假设并提供了行动方案的建议。
| 归档时间: |
|
| 查看次数: |
2454 次 |
| 最近记录: |