编译器警告 C4984

“if constexpr”是一种 C++17 语言扩展

备注

编译器在使用默认 C++14 标准编译的代码中发现了 if constexpr 表达式。 从 C++17 标准起,开始指定此表达式。 如果需要 C++11 或 C++14 兼容性,则此表达式不可移植。

默认情况下,C4984 作为错误发出,但可以将其禁止。 要通过将代码编译为 C++17 来启用此表达式,请使用 /std:c++17 模式或更高版本。 若要将针对 C++14 编译的代码中的 if constexpr 表达式用作 Microsoft 扩展,可以禁止、禁用或更改错误消息的警告级别。 可以使用 /wd4984 禁用 C4984,或使用 /wN4984 将其作为 N 级警告而不是错误启用。 或者,将 #pragma warning(suppress:4984) 添加到在源文件中导致警告的行之前。

从 Visual Studio 2017 版本 15.3 开始,此警告可用。 有关如何禁用特定编译器版本或更高版本中引入的警告的信息,请参阅由编译器版本引发的编译器警告

示例

此示例生成 C4984,并演示修复方法:

// C4984.cpp
// compile with: cl /EHsc C4984.cpp
#include <iostream>

int main()
{
    constexpr bool compile_time = true;
    // Uncomment the following line or use /std:c++17 to fix
    // #pragma warning(suppress:4984)
    if constexpr (compile_time)
    {
        std::cout << "compile_time is true";
    }
    else
    {
        std::cout << "compile_time is false";
    }
}