Подтвердить что ты не робот

Может ли std:: function хранить указатели на элементы данных?

Из cppreference я обнаружил, что:

Шаблон класса std:: function - универсальная полиморфная функциональная оболочка. Экземпляры std:: function могут хранить, копировать и вызывать любые вызываемые целевые функции, лямбда-выражения, выражения привязки или другие функциональные объекты, а также указатели на функции-члены и указатели на элементы данных.

Я не понимаю, почему std::function должен иметь возможность хранить такой указатель, и я никогда раньше не слышал об этой функции.
Возможно ли, я что-то пропустил или что ошибка в документации?

Как должен выглядеть operator() в таком случае?
Как из документации:

Вызывает сохраненную целевую функцию с параметрами args.

Во всяком случае, для вызова здесь не будет сохранена вызываемая функция-функция. Я не прав?

Честно говоря, я даже не могу понять, какой правильный синтаксис для такой функции, иначе я бы написал пример, чтобы проверить его.
Как можно использовать следующий шаблон для определения указателя на элемент данных?

template< class R, class... Args >
class function<R(Args...)>
4b9b3361

Ответ 1

Эффект вызова оператора вызова функции std::function<R(ArgTypes...)>:

R operator()(ArgTypes... args) const

эквивалентно (§ 20.9.11.2.4 [func.wrap.func.inv]/p1):

INVOKE(f, std::forward<ArgTypes>(args)..., R)

определение которого включает следующую марку (§ 20.9.2 [func.require]/p1):

Определите INVOKE (f, t1, t2,..., tN) следующим образом:

[...]

1.3 - t1.*f, когда N == 1 и f является указателем на данные элемента класса T и t1 является объектом типа T или ссылку на объект типа T или ссылку на объект типа, полученного из T;

тогда, когда f является указателем на элемент данных, сохраненным во внутреннем invoker из std::function, тогда сам std::function должен определить один аргумент, например:

std::function<int(std::pair<int,int>)> f = &std::pair<int,int>::first;

f(std::make_pair(1, 2));

DEMO