Здравствуйте, Sinclair, Вы писали:
S>В вашем коде зато нет compile-time запрета на вызов try_to_change_amount в невалидном контексте.
Есть.
S>Вы просто заменили одну небезопасную функцию на другую небезопасную функцию.
Нет.
S>Вот вам пример кода, который приводит к runtime fault в вашем коде:
...
Order o = create_order();
o.SetRisk(10000);
try_to_change_amount(o);
...
S>Этот код прекрасно компилируется, и в 100% запусков показывает "осмысленная ошибка".
Этот код не скомпилируется. (Впрочем, зависит от реализации SetRisk, если мы там ошибочно забудем навесить на order предикат HasRisk, то действительно скомпилируется.)
Прошу прощения, здесь я наврал. Этот код действительно скомпилируется, ведь мы предусмотрели возможность передачи в try_to_change_amount невалидного ордера.
А вот если бы потребовали только валидный, как здесь —
http://rsdn.ru/forum/philosophy/5967700?tree=treeАвтор: AlexRK
Дата: 27.02.15
— то не скомпилируется.
S>Каких ещё очевидных вещей вы не понимаете?
Боюсь, это вы чего-то не понимаете.