2015-12-02 2 views
0

Я читаю о функциях constexpr и static_assert на C++, и одна вещь мне кажется непонятной - я читал, что функции constexpr не всегда всегда оцениваются во время компиляции, и они иногда может оцениваться во время выполнения. Меня беспокоит то, что static_assert всегда проверяется во время компиляции. Итак, что произойдет, если мы пройдем constexpr до static_assert, но компилятор решит оценить это constexpr во время выполнения? Это даже проблема?C++ - Static_assert и способность функций constexpr оценивать во время выполнения

ответ

3

constexpr функции не обязательно всегда вычисляются во время компиляции

Он всегда оценивается во время компиляции, когда оно должно быть, поэтому, когда возвращаемое значение используется в качестве сопзЬ выражения.

static_assert - один из этих случаев. constexpr int value = f(); или C<f()> c; (аргумент шаблона) - это другие случаи.

, но в std::cout << f(), его не требуется вычислять во время компиляции.

А в void bar(int p) { const int v = f(p);}, f не могут быть оценены как constexpr (в зависимости от параметра функции, которые не являются (не может быть) constexpr).

0

Нет, это не проблема. В стандарте говорится, что если он оценивает значение true, оператор не действует (и если он оценивает значение false, программа плохо сформирована). Следствием этого является то, что при оценке во время выполнения выражение может не иметь (наблюдаемых) побочных эффектов (прямо или косвенно).

То, что компилятор может оценивать постоянные выражения во время выполнения, не освобождает компилятор от бремени оценки этого выражения во время компиляции. Это связано с тем, что компилятор должен предоставить диагностическое сообщение, если оно не true.

 Смежные вопросы

  • Нет связанных вопросов^_^