我在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标志可以解决这些问题,但为什么会有两个不同的信息?语言扩展和编译器标志要求之间有什么区别?
我对这个事情比较感兴趣,因为我在虚幻引擎4.24中写一个游戏,我可以使用'if constexpr',但是我不能使用'structured bindings',即使我使用的是同一个编译器。
为什么会这样?
if constexpr
是来自C++17的一个非常有用的语言结构。 例如,它对于在标准库中实现许多优化是非常方便的。
因此,当Visual Studio 15.3最初实现了 "结构化绑定 "时,它是一个非常有用的语言结构。if constexpr
在他们的标准库实现中,即使是在C++14模式下编译,也大量使用了这些代码。但是由于这些代码大部分都在头文件中,而头文件对于编译器来说是源代码的一部分,这意味着 你 也能使用它。为了让这一点,他们做了 使用 if constexpr
来自C++14的警告 而不是一个错误,他们在头文件中用 #pragma
s.
然而,尽管MSVC的文件 呼叫 是一个警告,它是由编译器发出的。误而这一点是可以压制的。
因此,这两个条件在措辞上的差异很可能是由于以下事实造成的。if constexpr
"error "被认为是一个 "警告",尽管默认情况下它本身呈现为一个 "错误"。