Из того, что я понимаю, функция constexpr может быть выполнена во время компиляции, а также во время выполнения, в зависимости от того, может ли вся оценка быть выполнена во время компиляции или нет.Как я могу выполнить команду runtime assert в функции constexpr?
Однако вы не можете перегружать эту функцию, чтобы иметь время выполнения и копию времени компиляции.
Так что мой вопрос в том, как я могу включить в runtime assert, чтобы гарантировать, что выполнение функции выполнения передается действительными параметрами вместе с моим static_assert?
Я также выяснили, что вы можете использовать assert непосредственно в контексте списка. 'constexpr bool in_range (int val, int min, int max) {return (assert (min <= max), min <= val && val <= max); } 'В принципе, вы должны сделать так, чтобы он никогда не мог получить вызов non-constexpr, если он используется в контексте constexpr при ошибке. Это работает, потому что assert - это макрос к тернарному выражению, которое оценивает вызов базовой функции non-constexpr при ошибке. – Adrian
@Adrian интересно отметить, что [оператор запятой разрешен только в постоянных выражениях в C++ 11] (http://stackoverflow.com/q/27324573/1708801). –
@Adrian, хотя это не будет переносимым, поскольку оно опирается на деталь реализации 'assert', которая не покрывается стандартом. –