Я читал о 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;
Почему выдает ошибку?
Вы неправильно поняли значение 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
,