Search code examples
c++c++17callable

How to understand "well formed when treated as an unevaluated operand"


As per the document, which says that[emphasis mine]:

template <class Fn, class... ArgTypes>
struct is_invocable; 

Determines whether Fn can be invoked with the arguments ArgTypes.... Formally, determines whether INVOKE(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.


Solution

  • 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.