если 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;

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

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

7

Другие решения

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

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

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

5

По вопросам рекламы [email protected]