std::experimental::ranges::Invocable, std::experimental::ranges::RegularInvocable

Header: <experimental/ranges/concepts>

The Invocable concept specifies that a callable type F can be called with a set of argument types Args… using the function template ranges::invoke.

# Declarations

template< class F, class... Args >
concept bool Invocable =
requires(F&& f, Args&&... args) {
ranges::invoke(std::forward<F>(f), std::forward<Args>(args)...);
/* not required to be equality preserving */
};

(ranges TS)

template< class F, class... Args >
concept bool RegularInvocable = Invocable<F, Args...>;

(ranges TS)

# Notes

The distinction between Invocable and RegularInvocable is purely semantic.

A random number generator may satisfy Invocable but cannot satisfy RegularInvocable (comical ones excluded).