c++17 语言扩展和 std:c++17 标志

c++17 language extension and std:c++17 flag

我对 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 Engine4.24写游戏可以用'if constexpr',但是我不能用'structured bindings'虽然我我正在使用相同的编译器。

为什么?

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

因此,当 Visual Studio 15.3 最初实现时 if constexpr,即使在 C++14 模式下编译时,它也被广泛用于其标准库实现中。但是由于大部分代码都在 headers 中,就编译器而言,它是源代码的一部分,这意味着 也可以使用它。为了做到这一点,他们制造了 using if constexpr from C++14 a warning 而不是错误,他们在 headers 中用 #pragma 禁用了警告。

然而,尽管 MSVC 的文档称其为警告,但编译器将其作为 a error 发出,可以取消。

因此,这两个条件之间的措辞差异很可能是由于 if constexpr "error" 被认为是 "warning",尽管它本身是一个默认 "error"。