(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]) shall be
Cpp17MoveConstructible.
A 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 shall ensure that rvalue arguments are delivered as rvalue references
and lvalue arguments are delivered as lvalue references.
A simple call wrapper is a 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.