Я думаю, что хорошо помнить, что поведение Вашего инструмента по умолчанию должно создать форму низкого уровня Связи Не Сцепление; и просмотрите его скептически и переопределите его, если это не имеет смысл по некоторым определенным упомянутым выше причинам. Но это не хорошее поведение по умолчанию.
Функторы должны быть сконструированы таким образом, чтобы копия функтора была идентична оригинальному функтору. То есть, если вы делаете копию одного функтора и затем выполняете последовательность операций, результат должен быть одинаковым независимо от того, какой функтор вы используете, или даже если вы чередуете два функтора. Это дает реализации STL гибкость для копирования функторов и передачи их по своему усмотрению.
С вашим первым функтором это утверждение не выполняется, потому что, если я скопирую ваш функтор и затем вызову его, изменения, внесенные в его сохраненный набор, не будут отражены в исходном функторе, поэтому копия и оригинал будут работать по-разному. Аналогично, если вы возьмете второй функтор и не сохраните его набор по ссылке, две копии функтора не будут вести себя одинаково.
Причина того, что ваша окончательная версия функтора работает, заключается в том, что тот факт, что набор хранится по ссылке, означает, что любое количество копий фьюнтера будет вести себя идентично друг другу.
Надеюсь, это поможет!