C++ - Static_assert и способность функций constexpr оценивать во время выполнения
Я читаю о constexpr
а также static_assert
функции в C++, и одна вещь, кажется, смущает меня - я читал, что constexpr
функции не всегда оцениваются во время компиляции, и иногда они могут оцениваться во время выполнения. Меня беспокоит то, что static_assert
всегда проверяется во время компиляции. Так что же произойдет, если мы пройдем constexpr
в static_assert
, но компилятор решает оценить это constexpr
во время выполнения? Это даже проблема?
2 ответа
Функции constexpr не обязательно всегда оцениваются во время компиляции
Он всегда вычисляется во время компиляции, когда это необходимо, поэтому, когда его возвращаемое значение используется в качестве выражения const.
static_assert
является одним из этого случая.constexpr int value = f();
или же C<f()> c;
(аргумент шаблона) - другие случаи.
но в std::cout << f()
не требуется вычислять во время компиляции.
И в void bar(int p) { const int v = f(p);}
, f
не может быть оценено как constexpr
(зависит от параметра функции, которой нет (не может быть) constexpr
).
Нет, это не проблема. Стандарт гласит, что если он оценивается как истинный, утверждение не имеет никакого эффекта (и если он оценивается как ложный, программа является некорректной). Следствием этого является то, что при оценке во время выполнения выражение может не иметь никаких (наблюдаемых) побочных эффектов (прямо или косвенно).
То, что компилятору разрешено вычислять константные выражения во время выполнения, в любом случае не освобождает компилятор от необходимости оценивать это выражение во время компиляции. Это потому, что компилятор должен предоставить диагностическое сообщение, если это не так true
,