为啥“if constexpr”不能与 Visual Studio 2017 15.3 一起编译?

Posted

技术标签:

【中文标题】为啥“if constexpr”不能与 Visual Studio 2017 15.3 一起编译?【英文标题】:Why does "if constexpr" not compile with Visual Studio 2017 15.3?为什么“if constexpr”不能与 Visual Studio 2017 15.3 一起编译? 【发布时间】:2017-09-06 00:35:04 【问题描述】:

根据以下文档:C++17 Features In Visual Studio 2017 Version 15.3 Preview,C++17 引入的 if constexpr 语法应与 /std:c++14 编译器开关一起使用。

但是,它不起作用。相反,会生成以下编译器错误:

错误 C4984:'if constexpr' 是 C++17 语言扩展

文档有误吗?

如果是这样,if constexpr 如何在 Visual Studio 2017 15.3 中编译?

【问题讨论】:

它说它支持它,它没有声称它在/std:c++14 下得到支持;事实上,它明确将其列为 C++17 功能,那么当您要求使用较旧的标准时,您为什么会期望它呢? 它说:“[F] 在 /std:c++14 下受支持,带有“警告 C4984:...”,请参阅表下方的参考 [F]。 @AlexeyVoytenko:它给你一个 C4984 的“错误”而不是一个“警告”这一事实是否让你认为也许你编译时带有警告作为错误? @NicolBolas 我使用默认设置测试了项目,其中“警告作为错误”已关闭 (/WX-)。 呃,他们仍然默认不支持,即使警告级别 4 建议使用它... 【参考方案1】:

看起来问题中链接的文档在这里不准确。

要在 Visual Studio 2017 中使用 if constexpr,您需要使用 /std:c++17/std:c++latest 开关进行编译。

【讨论】:

我试过了,但使用 if constexpr (std::is_same< T, stuff>::value) thingthatbuilds; else thingthatdoesnt; 失败,并在 else 部分出现...构建错误。 你可以通过 VS2017 UI 找到这个选项:Project Properties -> Configuration Properties -> C/C++ -> Language -> C++ Language Standard 并选择 "ISO C++17 Standard"。如果 Project Properties -> Configuration Properties -> General -> Platform Toolset 设置为 "Visual Studio 2017 (v141)""Visual Studio 2017 - Windows XP (v141_xp)",则此选项可用。

以上是关于为啥“if constexpr”不能与 Visual Studio 2017 15.3 一起编译?的主要内容,如果未能解决你的问题,请参考以下文章

win10 64位 python3.6 django1.11 MysqlDB No module named 'MySQLdb' 安装MysqlDB报错 Microsoft Visua

visua studio 自定义路径宏

为啥 NSFileManager 不能与 UIDocumentBrowserViewController 一起使用?

为啥 TransactionScope 不能与 Sqlite 一起使用?

为啥 FileProvider 不能与广播一起使用?

为啥 ByRef 不能与 WithEvents 一起使用?