我最近了解到,如果std::reference_wrapper<T>
与函数相似,则T
对于函数调用操作符有重载。我想知道在我们捕获类似std::vector
的情况下,标准委托人是否给出了不包括数组下标运算符的原因。在我看来,这两个标准运算符中只有一个能作为类成员才能重载,这两个典型运算符中只有一个存在。
这背后的原理是什么?
通常,引用包装器不能支持基础类型的每个操作。例如,无法自动支持成员函数。下标运算符只是一个普通的操作,因此没有充分的理由支持它。当然,我们可以得到一个调用基础operator[]
的operator[]
,但是为什么不支持operator+
呢? operator==
? begin
和end
怎么样? :)
但是,重载函数调用运算符有一个重要的后果:该类成为函子类型。在许多情况下这可能很有用。例如:
std::for_each(first, last, std::ref(stateful_functor));
这是重载operator()
的充分理由。