std::invocable, std::regular_invocable
<concepts>
concept invocable =
requires(F&& f, Args&&... args) {
std::invoke (std::forward <F>(f), std::forward <Args>(args)...);
/* not required to be equality-preserving */
concept regular_invocable = std::invocable<F, Args...>;
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.2 Concept
- 18.7.3 Concept
regular_invocable[concept.regularinvocable]
- 18.7.3 Concept
- C++20 standard (ISO/IEC 14882:2020):
- 18.7.2 Concept
invocable[concept.invocable]
- 18.7.2 Concept
- 18.7.3 Concept
regular_invocable[concept.regularinvocable]
- 18.7.3 Concept
[edit] See also
(class template) [edit]