c++17 语言扩展和 std:c++17 标志
Posted
技术标签:
【中文标题】c++17 语言扩展和 std:c++17 标志【英文标题】:c++17 language extension and std:c++17 flag 【发布时间】:2020-06-05 13:59:27 【问题描述】:我对 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”,但即使使用相同的编译器,我也不能使用“结构化绑定”。
为什么?
【问题讨论】:
【参考方案1】:if constexpr
是来自 C++17 的一个非常有用的语言结构。例如,在标准库中实现许多优化非常方便。
因此,当 Visual Studio 15.3 最初实现 if constexpr
时,即使在 C++14 模式下编译时,它也被广泛用于其标准库实现中。但是由于大部分代码都在头文件中,就编译器而言,它是源代码的一部分,这意味着 你 也可以使用它。为此,他们使用using if constexpr
from C++14 a warning 而不是错误,这是他们在标题中使用#pragma
s 禁用的警告。
然而,尽管 MSVC 的文档将其称为警告,但编译器仍将其作为 a error 发出,这可以被抑制。
因此,这两个条件之间的措辞差异很可能是因为if constexpr
“错误”被认为是“警告”,尽管默认情况下将其自身显示为“错误”。
【讨论】:
但是,OP 明确表示他们收到 errors,而不是 warnings,因此这不能回答问题。 @JörgWMittag:我只是在重复 MSVC 自己的 release notes say:““if constexpr”在 /std:c++14 中受支持,并带有可以抑制的警告,令人高兴模板元编程库作者无处不在。" @JörgWMittag 无论如何,从标准的角度来看,它们都只是“诊断”,没有区分它们的严重性。 @JörgWMittag:我找到了更多信息;他们在文档中明确将其称为警告,但默认情况下它呈现为错误。我想它可以被压制的事实是微软认为它们不同的原因。 哦,亲爱的 MSVC 和他们自己的标准,所以他们将 'if constexpr' 放入 c++14 中!这解释了很多。谢谢!以上是关于c++17 语言扩展和 std:c++17 标志的主要内容,如果未能解决你的问题,请参考以下文章
如何检查g ++是否支持SCons中的c ++ 14/17?