Если constexpr() выдает ошибку в C++17

Я читал о 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;

Почему выдает ошибку?

2 ответа

Решение

Вы неправильно поняли значение 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 во время компиляции, поэтому в зависимости от его значения в скомпилированном коде останется только одна из трех ветвей.

if constexpr ( condition ) работает время компиляции, так condition должно быть оценено время компиляции.

int i = 0 не постоянная переменная, так i == 0 не оценивается время компиляции.

Попробуй с int const i = 0 или лучше, constexpr int i = 0,

Другие вопросы по тегам