Есть ли способ заставить функцию constexpr не оцениваться во время компиляции [?]
Если вы можете изменить функцию constexpr
, добавив неиспользуемый параметр, выможет заставить оценку во время выполнения передать значение времени выполнения.
Я имею в виду ... предположим, что у вас есть следующая constexpr
функция
constexpr int getVal ()
{ return 0; }
, которую вы можете использовать следующим образом
constexpr auto a = getVal();
auto b = getVal();
и (игнорируя правило "как есть") вы уверены, что getVal()
вычисляется при инициализации времени компиляции a
, но вы не знаете, вычисляется ли он во время компиляции или во время выполненияинициализация b
.
Но если вы измените функцию следующим образом
constexpr int getVal (int)
{ return 0; }
, вы можете написать
int c = 1;
constexpr auto a = getVal(0);
auto b = getVal(c);
, теперь вы можете быть уверены, что getVal()
вычисляемая инициализация во время компиляции a
(потому что a
- это constexpr
, а 0
- литерал), и это вычисляемая инициализация во время выполнения b
(потому что c
не может использоваться в constexpr
выражение).
Вы также можете проверить, что при записи
int c = 1;
constexpr auto a = getVal(c);
вы получите ошибку компиляциипричина a
должна быть инициализирована во время компиляции, но getVal(c)
не может быть вычислена во время компиляции.