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 而不是错误,这是他们在标题中使用#pragmas 禁用的警告。

然而,尽管 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 标志的主要内容,如果未能解决你的问题,请参考以下文章

clang 忽略包含文件的 -std=c++11 标志

设置 C 标准标志启用 GNU 扩展

如何检查g ++是否支持SCons中的c ++ 14/17?

C++17 排序:赋值左侧的后增量

lambda 如何在 MSVC2017 15.9.3 中使用 /std:c++17 中的静态局部错误返回值?

clang 编译器挂着 -std=c++17 -O3