As per the document, which says that[emphasis mine]:
template <class Fn, class... ArgTypes> struct is_invocable;Determines whether
Fncan be invoked with the argumentsArgTypes....Formally, determines whetherINVOKE(declval<Fn>(), declval<ArgTypes>()...)is well formed when treated as an unevaluated operand, where INVOKE is the operation defined in Callable.
How to understand the statement in bold? What's "an unevaluated operand"?
Maybe, a simple example helps to fully understand this matter.
CodePudding user response:
How to understand the statement in bold? What's "an unevaluated operand"?
An unevaluated operand is an operand that is not evaluated.
Maybe, a simple example helps to fully understand this matter.
void g(auto) requires false;
void f(auto x) { g(x); }
static_assert(is_invocable_v<decltype(f<int>), int>);
f(0); // ill-formed
Considering the above example, since is_invocable is not evaluated, g(x) in f will not actually be invoked either, so the static_assert will pass.
Since f(0) is actually evaluated, which will fail because g(0) fails to satisfy the constraints.
