0

我已使用此参考链接constexpr在 C++17 中阅读了有关内容。

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

为什么会报错?

4

2 回答 2

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,因此根据它的值,三个分支中只有一个会保留在编译后的代码中。

于 2017-09-12T11:18:13.617 回答
5

if constexpr ( condition )工程编译时间,所以condition必须是可评估的编译时间。

int i = 0不是一个常量变量,所以i == 0不是可评估的编译时间。

试试int const i = 0or,更好,constexpr int i = 0.

于 2017-09-12T11:09:40.200 回答