(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]) meets the Cpp17MoveConstructible
and Cpp17Destructible requirements.
An 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 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.
A simple call wrapper is a perfect forwarding call wrapper that meets
the Cpp17CopyConstructible and Cpp17CopyAssignable requirements
and whose copy constructor, move constructor, and assignment operators
are constexpr functions that do not throw exceptions.
The copy/move constructor of an argument 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.
Argument 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.