Я только что посмотрел cppcon talk , где автор замороженной библиотеки объясняет, как он использует assert в функциях constexpr и работает (потому что во время выполнения он работает так, как должен, а во время компиляции запускает выполнение без constexpr) функции, чтобы произошла ошибка компилятора).
Проблема в том, что вы не можете дать пользователю значительную текстовую ошибку, как в случае static_assert, и компиляция завершается неудачно в реализации макроса assert.
Также вы не можете использовать static_assert для аргументов функции, поскольку они не являются constexpr, и я не хочу перемещать аргументы функции внутри <>, чтобы сделать их constexpr. Вот пример преобразования, которого я хочу избежать:
constexpr unsigned int safe_right_shift(const unsigned int val, const unsigned shift){
assert(shift<sizeof(unsigned int)*CHAR_BIT); //ugly error
return val >>shift;
}
template<unsigned int shift>
constexpr unsigned int safe_right_shift_t(const unsigned int val){
static_assert(shift<sizeof(unsigned int)*CHAR_BIT);
return val >>shift;
}
Есть ли лучший способ в C ++ 17 сделать то, что сделал бы гипотетический constexpr_assert?
Я определяю constexpr_assert как утверждение, которое проверяет значения только во время вычисления constexpr (он же время компиляции).
P.S.
Ошибка:
примечание: функция non-constexpr '__assert_fail' не может использоваться в константном выражении
полный код