и здесь понятно как оно работает. Смысл в том, что find(set, key) - даёт разные типы. Если ключ есть в set - тип будет opt<value_type>, а если нет - будет nothing - пустой optional
ну первое и фундаментальное отличие - это ограничения. Именно ограничения. Т.е. они, условно, пропускают только типы с необходимыми свойствами. Но остальные свойства не теряются