Ответ 1
Да, это стандартно. [func.wrap.func.inv] указывает, что operator()(ArgTypes&&... args)
std::function
вызывает
INVOKE
(f, std::forward<ArgTypes>(args)..., R)
(20.8.2), гдеf
- целевой объект (20.8.1)*this
.
(Где R
- указанный тип возвращаемого значения.)
[func.require] определяет INVOKE
:
Определите
INVOKE
(f, t1, t2, ..., tN)
следующим образом:
(t1.*f)(t2, ..., tN)
, когдаf
является указателем на функцию-член классаT
иt1
является объектом типаT
или ссылкой на объект типаT
или ссылка на объект типа, полученного изT
;
((*t1).*f)(t2, ..., tN)
, когдаf
является указателем на функцию-член классаT
иt1
не является одним из типов, описанных в предыдущий элемент;- [...]
Обратите внимание, что конечный R
в вызове используется для преобразования в R
(тип возврата function
):
Определите
INVOKE
(f, t1, t2, ..., tN, R)
какINVOKE
(f, t1, t2, ..., tN)
, неявно преобразованный вR
.
Первый и единственный аргумент, который вы указываете, является указателем на объект Foo
-объект. Таким образом, вызов method
вызывает вызов (void)((*t1).*f)()
, который при написании с вашими значениями эквивалентен ((*(&myFoo)).&Foo::bar)()
, что эквивалентно myFoo.bar()
.