LINUX.ORG.RU

История изменений

Исправление wandrien, (текущая версия) :

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

Ну и собственно потому исходная задача не решена.

Ведь задача была в чем - удостовериться, что делитель может быть не равен нулю.

Идея возвращать некоторый абсурд вместо реальной арифметики (единицу вместо нуля при вычитании/сложении) - это не решение, а просто попытка свести принудительно типы, пожертвовав смыслом решаемой задачи.

Есть очевидный способ добиться того, что делитель не равен нулю - это использовать константный делитель.

В выражении вида x / constexpr(y) есть три очевидных исхода компиляции:

  • Компилятор вычисляет y в константу, и она не равна нулю - программа компилируется.
  • Компилятор вычисляет y в константу, и она равна нулю - программа не компилируется, поскольку деление на нулевую константу диагностируется при компиляции.
  • Компилятор не может вычислить y в константу - программа не компилируется, поскольку не выполнено требование constexpr().

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

Исходная версия wandrien, :

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

Ну и собственно потому исходная задача не решена.

Ведь задача была в чем - удостовериться, что делитель может быть не равен нулю.

Идея возвращать некоторый абсурд вместо реальной арифметики (единицу вместо нуля при вычитании/сложении) - это не решение, а просто попытка свести принудительно типы, пожертвовав смыслом решаемой задачи.

Есть очевидный способ добиться того, что делитель не равен нулю - это использовать константный делитель.

В выражении вида x / constexpr(y) есть три очевидных исхода компиляции:

  • Компилятор вычисляет y в константу, и она не равна нулю - программа компилируется.
  • Компилятор вычисляет y в константу, и она равна нулю - программа не компилируется, поскольку деление на нулевую константу диагностируется при компиляции.
  • Компилятор не может вычислить y в константу - программа не компилируется, поскольку не выполнено требование constexpr().

Вот если мы не используем constexpr(), то нам требуется честно описать такую арифметику для типа, которая будет учитывать области значений исходных переменных и получающихся результатов и прерывать компиляцию, если область значений включает в себя нуль.