Подстрочный оператор для reference_wrapper - PullRequest
4 голосов
/ 25 октября 2019

Недавно я узнал, что std::reference_wrapper<T> имеет перегрузку для оператора вызова функции в случае, если T подобен функции. Интересно, есть ли причина, приведенная стандартным комитетом, не включать оператор индекса массива в случаях, когда мы фиксируем что-то вроде std::vector. Мне кажется странным, что в этом стандартном классе присутствует только один из двух типичных операторов, которые могут быть перегружены только как член класса.

В чем причина этого?

1 Ответ

1 голос
/ 25 октября 2019

Как правило, справочная оболочка не может поддерживать все операции базового типа. Например, нет способа автоматически поддерживать функции-члены. Подстрочный оператор - обычная операция, поэтому нет веских причин для его поддержки. Конечно, мы можем получить operator[], который вызывает базовый operator[], но тогда почему бы не поддержать operator+? operator==? Как насчет begin и end? :)

Перегрузка оператора вызова функции имеет важное следствие: класс становится типом функтора. Это может быть полезно для многих ситуаций. Например:

std::for_each(first, last, std::ref(stateful_functor));

Это веская причина для перегрузки operator().

...