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

时间:2017-09-12 11:05:44

标签: c++ c++17 constexpr if-constexpr

我使用此reference链接了解了C ++ 17中的constexpr

然后,我制作了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;

为什么会出错?

2 个答案:

答案 0 :(得分:7)

你误解了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的值,因此根据其值,只有三个分支中的一个将保留在已编译的代码中。

答案 1 :(得分:5)

if constexpr ( condition )适用于编译时,因此condition必须是可评估的编译时间。

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

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