Есть ли способ потребовать от компилятора подтверждения свойства выражения времени выполнения, аналогичного static_assert, но без требования, чтобы выражение было constexpr?
Тривиальный случай будет примерно таким:
unsigned f(unsigned i) {
if (i == 0)
return 1;
static_assert(i != 0);
return i > 0 ? i + 20 : i + 30;
}
Это не скомпилируется, поскольку i не является постоянным выражением, что имеет смысл. При компиляции этой функции без static_assert (https://godbolt.org/z/o3KjYGTGr) ясно, что компилятор понимает, что i не равен 0 на уровне оптимизации -O2. Итак, есть ли способ потребовать от компилятора доказать, что i не равен 0, и прервать компиляцию, если он не может этого сделать?
Практический случай использования этого — когда есть представляет собой значительный объем кода между проверкой и возможным использованием значения без затрат на проверку во время выполнения:
if (i == 0)
return;
// many lines of code
// assert that i != 0 here
function_that_requires_a_nonzero_arg(i);
Подробнее здесь: https://stackoverflow.com/questions/790 ... expression