История изменений
Исправление wandrien, (текущая версия) :
И если у нас была проблема в том, что мы хотели избежать ран-тайм броска исключения / возвращения кода ошибки / возвращения Optional в делении, то здесь мы просто приходим к тому, что нам нужно это самое {бросок исключения / возвращение кода ошибки / возвращение Optional} кодировать в арифметических операциях над Not0. Во всех. От чего ушли, к тому и пришли.
Ну и собственно потому исходная задача не решена.
Ведь задача была в чем - удостовериться, что делитель может быть не равен нулю.
Идея возвращать некоторый абсурд вместо реальной арифметики (единицу вместо нуля при вычитании/сложении) - это не решение, а просто попытка свести принудительно типы, пожертвовав смыслом решаемой задачи.
Есть очевидный способ добиться того, что делитель не равен нулю - это использовать константный делитель.
В выражении вида x / constexpr(y)
есть три очевидных исхода компиляции:
- Компилятор вычисляет
y
в константу, и она не равна нулю - программа компилируется. - Компилятор вычисляет
y
в константу, и она равна нулю - программа не компилируется, поскольку деление на нулевую константу диагностируется при компиляции. - Компилятор не может вычислить
y
в константу - программа не компилируется, поскольку не выполнено требованиеconstexpr()
.
Вот если мы не используем constexpr()
, то нам требуется честно описать такую арифметику для типа, которая будет учитывать области значений исходных переменных и получающихся результатов и прерывать компиляцию, если область значений финального результата включает в себя нуль.
Исходная версия wandrien, :
И если у нас была проблема в том, что мы хотели избежать ран-тайм броска исключения / возвращения кода ошибки / возвращения Optional в делении, то здесь мы просто приходим к тому, что нам нужно это самое {бросок исключения / возвращение кода ошибки / возвращение Optional} кодировать в арифметических операциях над Not0. Во всех. От чего ушли, к тому и пришли.
Ну и собственно потому исходная задача не решена.
Ведь задача была в чем - удостовериться, что делитель может быть не равен нулю.
Идея возвращать некоторый абсурд вместо реальной арифметики (единицу вместо нуля при вычитании/сложении) - это не решение, а просто попытка свести принудительно типы, пожертвовав смыслом решаемой задачи.
Есть очевидный способ добиться того, что делитель не равен нулю - это использовать константный делитель.
В выражении вида x / constexpr(y)
есть три очевидных исхода компиляции:
- Компилятор вычисляет
y
в константу, и она не равна нулю - программа компилируется. - Компилятор вычисляет
y
в константу, и она равна нулю - программа не компилируется, поскольку деление на нулевую константу диагностируется при компиляции. - Компилятор не может вычислить
y
в константу - программа не компилируется, поскольку не выполнено требованиеconstexpr()
.
Вот если мы не используем constexpr()
, то нам требуется честно описать такую арифметику для типа, которая будет учитывать области значений исходных переменных и получающихся результатов и прерывать компиляцию, если область значений включает в себя нуль.