GCC9 уже реализует std::is_constant_evaluated
. Я немного поиграл с этим, и понял, что это несколько сложно. Вот мой тест:
constexpr int Fn1()
{
if constexpr (std::is_constant_evaluated())
return 0;
else
return 1;
}
constexpr int Fn2()
{
if (std::is_constant_evaluated())
return 0;
else
return 1;
}
int main()
{
constexpr int test1 = Fn1(); // Evaluates to 0
int test2 = Fn1(); // Evaluates to 0
int const test3 = Fn1(); // Evaluates to 0
constexpr int test4 = Fn2(); // Evaluates to 0
int test5 = Fn2(); // Evaluates to 1
int const test6 = Fn2(); // Evaluates to 0
}
По этим результатам я извлек следующие выводы:
-
if constexpr (std::is_constant_evaluated())
всегда оцениваетtrue
ветвь. Поэтому нет смысла использовать эту конструкцию. -
Если компилятор оценивает переменную во время компиляции,
std::is_constant_evaluated())
имеет значениеtrue
, независимо от того, является ли эта переменная явно аннотированнойconstexpr
или нет.
Я прав?