std::invocable, std::regular_invocable - cppreference.com (original) (raw)
| Defined in header | | | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ------------- | | template< class F, class... Args > concept invocable = requires(F&& f, Args&&... args) { std::invoke(std::forward<F>(f), std::forward<Args>(args)...); /* not required to be equality-preserving */ }; | | (since C++20) | | template< class F, class... Args >concept regular_invocable = std::invocable<F, Args...>; | | (since C++20) |
The invocable
concept specifies that a callable type F
can be called with a set of arguments Args...
using the function template std::invoke.
The regular_invocable
concept adds to the invocable
concept by requiring the invoke
expression to be equality-preserving and not modify either the function object or the arguments.
[edit] Equality preservation
Expressions declared in requires expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).
[edit] Notes
The distinction between invocable
and regular_invocable
is purely semantic.
A random number generator may satisfy invocable
but cannot satisfy regular_invocable
(comical ones excluded).
[edit] References
C++23 standard (ISO/IEC 14882:2024):
18.7.2 Concept
invocable
[concept.invocable]18.7.3 Concept
regular_invocable
[concept.regularinvocable]C++20 standard (ISO/IEC 14882:2020):
18.7.2 Concept
invocable
[concept.invocable]18.7.3 Concept
regular_invocable
[concept.regularinvocable]
[edit] See also
[edit] External links
A joke example of a random number generator that satisfies both invocable
and regular_invocable
.