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,

Другие вопросы по тегам