如果 constexpr() 在 C++17 中给出错误

if constexpr() gives an error in C++17

我已经阅读了关于 constexpr 在 C++17 中使用这个 reference link.

然后,我编写了C++程序来测试constexpr :

#include <iostream>

int i = 10;

int func() 
{
    if constexpr (i == 0)
        return 0;
    else if (i > 0)
        return i;
    else
        return -1;
}

int main() 
{
    int ret = func();
    std::cout<<"Ret : "<<ret<<std::endl;
}

但是,编译器报错:

main.cpp: In function 'int func()':
main.cpp:8:25: error: the value of 'i' is not usable in a constant expression
     if constexpr (i == 0)
                         ^
main.cpp:4:5: note: 'int i' is not const
 int i = 10;

为什么报错?

if constexpr ( condition ) 在编译时运行,因此 condition 必须是可评估的编译时。

int i = 0 不是常量变量,因此 i == 0 不是可评估的编译时间。

尝试使用 int const i = 0 或更好的 constexpr int i = 0

你误解了if constexpr的意思。这不是要在运行时执行的 const 表达式的测试,而是要在编译时执行的逻辑表达式的测试。

该构造与预处理器的 #if 大致相似,因为其他分支以及可能无法编译的代码被删除。

这会起作用:

template<int  i>
int func() 
{
    if constexpr (i == 0)
        return 0;
    else if constexpr (i > 0)
        return i;
    else
        return -1;
}

编译器在编译时知道 i 的值,因此根据其值,三个分支中只有一个会保留在编译后的代码中。