(t1.get().*f)(t2, …, tN) when f is a pointer to a
member function of a class T
and remove_cvref_t<decltype(t1)> is a specialization of reference_wrapper;
Define INVOKE<R>(f, t1, t2, …, tN) as
static_cast<void>(INVOKE(f, t1, t2, …, tN))
if R is cvvoid, otherwise
INVOKE(f, t1, t2, …, tN) implicitly converted
to R.
Every call wrapper ([func.def]) is Cpp17MoveConstructible.
A argument forwarding call wrapper is a
call wrapper that can be called with an arbitrary argument list
and delivers the arguments to the wrapped callable object as references.
This forwarding step delivers rvalue arguments as rvalue references
and lvalue arguments as lvalue references.
A simple call wrapper is an argument forwarding call wrapper that is
Cpp17CopyConstructible and Cpp17CopyAssignable and
whose copy constructor, move constructor, copy assignment operator,
and move assignment operator do not throw exceptions.
A perfect forwarding call wrapper is
an argument forwarding call wrapper
that forwards its state entities to the underlying call expression.
This forwarding step delivers a state entity of type T
as cvT&
when the call is performed on an lvalue of the call wrapper type and
as cvT&& otherwise,
where cv represents the cv-qualifiers of the call wrapper and
where cv shall be neither volatile nor constvolatile.
A call pattern defines the semantics of invoking
a perfect forwarding call wrapper.
A postfix call performed on a perfect forwarding call wrapper is
expression-equivalent ([defns.expression-equivalent]) to
an expression e determined from its call pattern cp
by replacing all occurrences
of the arguments of the call wrapper and its state entities
with references as described in the corresponding forwarding steps.
The copy/move constructor of a perfect forwarding call wrapper has
the same apparent semantics
as if memberwise copy/move of its state entities
were performed ([class.copy.ctor]).
This implies that each of the copy/move constructors has
the same exception-specification as
the corresponding implicit definition and is declared as constexpr
if the corresponding implicit definition would be considered to be constexpr.
Perfect forwarding call wrappers returned by
a given standard library function template have the same type
if the types of their corresponding state entities are the same.