Function objects
      A function object is any object for which the function call operator is defined. C++ provides many built-in function objects as well as support for creation and manipulation of new function objects.
Contents
[edit] Function invocation
The exposition-only operation INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) is defined as follows:
Let type Obj be the unqualified type of arg_0 (i.e., std::remove_cv <std::remove_reference <decltype(arg_0)>::type>::type)
-  If f is a pointer to member function of class C, thenINVOKE(f, obj, arg_1, arg_2, ..., arg_N) is equivalent to:
- If std::is_same <C, Obj>::value || std::is_base_of <C, Obj>::value is true
 - (obj.*f)(arg_1, arg_2, ..., arg_N) (invoke the member function on the object).
 
 -  If Objis a specialization of std::reference_wrapper
 - (obj.get().*f)(arg_1, arg_2, ..., arg_N) (invoke the member function on the specially referred object).
 
 - Otherwise
 - ((*obj).*f)(arg_1, arg_2, ..., arg_N) (invoke the member function on the dereferenced object).
 
 
-  Otherwise, if N == 0 and f is a pointer to data member of class C, thenINVOKE(mptr, obj) is equivalent to:
- If std::is_same <C, Obj>::value || std::is_base_of <C, Obj>::value is true
 - obj.*mptr (access the data member of the object).
 
 -  If Objis a specialization of std::reference_wrapper
 - obj.get().*mptr (access the data member of the specially referred object).
 
 - Otherwise
 - (*obj).*mptr (access the data member of the dereferenced object).
 
 
- Otherwise
-  INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) is equivalent to f(arg_0, arg_1, arg_2, ..., arg_N) (invoke the callable).
 
-  
The exposition-only operation INVOKE<R>(f, arg_0, arg_1, arg_2, ..., arg_N) is defined as follows:
-  If Ris (possibly cv-qualified) void
-  static_cast<void>(INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N)).
 
-  static_cast<void>(
- Otherwise
-  INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) implicitly converted toR.
 
-  
Let type Actual be decltype(INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N))
- If std::reference_converts_from_temporary_v <R, Actual> is true
-  INVOKE<R>(f, arg_0, arg_1, arg_2, ..., arg_N) is ill-formed.
 
-  
std::invoke and std::invoke_r(since C++23) can invoke any Callable object with given arguments according to the rules of INVOKE and INVOKE<R>(since C++23).
(function template) [edit]
[edit] Function wrappers
These polymorphic wrapper classes provide support for storing arbitrary function objects.
(class template) [edit]
(class template) [edit]
[edit] Identity
std::identity is the identity function object: it returns its argument unchanged.
[edit] Partial function application
std::bind_front and std::bind provide support for partial function application, i.e. binding arguments to functions to produce new functions.
(function template) [edit]
std::bind expression or can be used as one (class template) [edit]
(class template) [edit]
std::placeholders [edit] Negators
std::not_fn creates a function object that negates the result of the callable object passed to it.
(function template) [edit]
[edit] Searchers
Searchers implementing several string searching algorithms are provided and can be used either directly or with std::search .
[edit] Reference wrappers
Reference wrappers allow reference arguments to be stored in copyable function objects:
(function template) [edit]
Transparent function objects
Associative containers  and unordered associative containers (since C++20) provide heterogeneous lookup and erasure(since C++23) operations, but they are only enabled if the supplied function object type T is transparent : the qualified identifier T::is_transparent is valid and denotes a type.
All transparent function object types in the standard library define a nested type is_transparent. However, user-defined transparent function object types do not need to directly provide is_transparent as a nested type: it can be defined in a base class, as long as T::is_transparent satisfies the transparent requirement stated above.
[edit] Operator function objects
C++ defines the following function objects that represent common arithmetic and logical operations.
The void specializations deduce their parameter types and return types from their arguments, they are all transparent.
(since C++14)Arithmetic operations
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
Comparisons
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
Logical operations
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
Bitwise operations
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
(class template specialization) [edit]
Constrained comparison function objects
The following comparison function objects are constrained.
-  The equality operators (ranges::equal_toandranges::not_equal_to) require the types of the arguments to satisfyequality_comparable_with.
-  The relational operators (ranges::less,ranges::greater,ranges::less_equal, andranges::greater_equal) require the types of the arguments to satisfytotally_ordered_with.
-  The three-way comparison operator (compare_three_way) requires the type to modelthree_way_comparable_with.
All these function objects are transparent.
Helper items
Following exposition-only items are used for several components in the standard library but they are not part of the interface of the standard library.
concept /*callable*/ =
    requires (Fn&& fn, Args&&... args) {
        std::forward <Fn>(fn)(std::forward <Args>(args)...);
concept /*nothrow-callable*/ =
    /*callable*/<Fn, Args...> &&
    requires (Fn&& fn, Args&&... args) {
        { std::forward <Fn>(fn)(std::forward <Args>(args)...) } noexcept;
using /*call-result-t*/ = decltype(std::declval <Fn>()(std::declval <Args>()...));
using /*decayed-typeof*/ = decltype(auto(T));
Old binders and adaptors
Several utilities that provided early functional support are deprecated and removed:
Base
(class template) [edit]
(class template) [edit]
Binders
(class template) [edit]
(function template) [edit]
Function adaptors
(class template) [edit]
(class template) [edit]
(function template) [edit]
(class template) [edit]
(function template) [edit]
(class template) [edit]
(function template) [edit]
(class template) [edit]
(class template) [edit]
(function template) [edit]
(function template) [edit]
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior | 
|---|---|---|---|
| LWG 185 | C++98 | using function objects improved the program efficiency | removed the claim | 
| LWG 660 | C++98 | function objects for bitwise operations are missing | added | 
| LWG 2149 | C++98 | function objects taking one or two arguments were required to provide nested types to denote the argument and result types | not required | 
| LWG 2219 | C++11 | INVOKEdid not handle std::reference_wrapper  correctly | handles correctly | 
| LWG 2420 | C++11 | INVOKE<R>did not discard the return value ifRis void | discards the return value in this case | 
| LWG 2926 (P0604R0) | C++11 | the syntax of the INVOKEoperation with a returntype RwasINVOKE(f, t1, t2, ..., tN, R) | changed to INVOKE<R>(f, t1, t2, ..., tN) | 
| LWG 3655 | C++11 | INVOKEdid not handle unions correctlydue to the resolution of LWG issue 2219 | handles correctly |