0

我对 Visual Studio 2017(版本 15.9.11)中的不同错误感到困惑:

'if constexpr' is a C++17 language extension

language feature 'structured bindings' requires compiler flag '/std:c++17'

我知道添加 /std:c++17 标志可以解决这些问题,但为什么会有两条不同的消息?语言扩展和编译器标志要求有什么区别?

我对这件事更感兴趣,因为我正在使用 Unreal Engine 4.24 编写游戏,我可以使用“if constexpr”,但即使使用相同的编译器,我也不能使用“结构化绑定”。

为什么?

4

1 回答 1

3

if constexpr是来自 C++17 的一个非常有用的语言结构。例如,在标准库中实现许多优化非常方便。

因此,当 Visual Studio 15.3 最初实现if constexpr时,即使在 C++14 模式下编译时,它也被广泛地用于其标准库实现中。但是由于大部分代码都在头文件中,就编译器而言,它是源代码的一部分,这意味着您也可以使用它。为此,他们从 C++14 开始使用警告if constexpr不是错误,他们在标头中使用#pragmas 禁用了警告。

但是,尽管 MSVC 的文档将其称为警告,但编译器仍将其作为错误发出,可以抑制。

因此,这两个条件之间的措辞差异很可能源于if constexpr“错误”被认为是“警告”这一事实,尽管默认情况下将其自身呈现为“错误”。

于 2020-06-05T14:10:37.583 回答