Насколько я понимаю, std::is_constant_evaluated() заключается в том, что его можно использовать в качестве условия в операторе if constexpr для вызова функции constexpr во время компиляции и быстрой функции во время выполнения. Я считаю, что это соответствует
https://gist.github.com/Som1Lse/5309b11 ... fd803ba9d2
У меня есть следующий код
Код: Выделить всё
template
constexpr T myAbs(const T &value)
{
if constexpr (std::is_constant_evaluated())
return value < TypeTraits::zero ? -value : value;
else
{
return T(std::abs(value.getValueAsDouble()));
}
}
Цель состоит в том, чтобы использовать условное выражение во время компиляции, что может быть медленным, но является constexpr, а затем использовать std::abs во время выполнения, который затем сможет выполнить какое-то быстрое присвоение битов или что-то еще во время выполнения. Я использую C++20, поэтому std::abs не является constexpr. В рамках модульного тестирования я вызываю myAbs со static_assert
Код: Выделить всё
MyClass positive(5.0);
MyClass negative(-5.0);
static_assert (myAbs(positive) == positive, "Abs of a positive Physical should be itself");
static_assert (myAbs(negative) == positive, "Abs of a negative Physical should be the negative of itself");
В Visual Studio 2022 я получаю предупреждение
Код: Выделить всё
warning C5063: 'std::is_constant_evaluated' always evaluates to true in manifestly constant-evaluated expressions
Насколько я понимаю, я использую std::is_constant_evaluated() по назначению, но, возможно, это не так. Может ли кто-нибудь сказать мне, как мне его использовать, чтобы избежать этого предупреждения компилятора?
Подробнее здесь:
https://stackoverflow.com/questions/798 ... -a-warning