|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Old binders and adaptors | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
function::operator= | ||||
(until C++17) | ||||
| Non-member functions | ||||
(until C++20) | ||||
| Helper classes | ||||
(until C++17) | ||||
| Deduction guides(C++17) |
function& operator=(const function& other); | (1) | (since C++11) |
function& operator=( function&& other); | (2) | (since C++11) |
function& operator=(std::nullptr_t)noexcept; | (3) | (since C++11) |
template<class F> function& operator=( F&& f); | (4) | (since C++11) |
template<class F> function& operator=(std::reference_wrapper<F> f)noexcept; | (5) | (since C++11) |
Assigns a newtarget tostd::function.
Args... and return typeR.Contents |
| other | - | anotherstd::function object to copy the target of |
| f | - | a callable to initialize thetarget with |
| Type requirements | ||
-F must meet the requirements ofCallable. | ||
*this
Even before allocator support was removed fromstd::function in C++17, these assignment operators use the default allocator rather than the allocator of*this or the allocator ofother (seeLWG issue 2386).
#include <cassert>#include <functional>#include <utility> int inc(int n){return n+1;} int main(){std::function<int(int)> f1;std::function<int(int)> f2(inc);assert(f1== nullptr and f2!= nullptr); f1= f2;// overload (1)assert(f1!= nullptr and f1(1)==2); f1= std::move(f2);// overload (2)assert(f1!= nullptr and f1(1)==2);// f2 is in valid but unspecified state f1= nullptr;// overload (3)assert(f1== nullptr); f1= inc;// overload (4)assert(f1!= nullptr and f1(1)==2); f1=[](int n){return n+ n;};// overload (4)assert(f1!= nullptr and f1(2)==4); std::reference_wrapper<int(int)> ref1=std::ref(inc); f1= ref1;// overload (5)assert(f1!= nullptr and f1(1)==2);}
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2132 | C++11 | the overload(4) taking aCallable object might be ambiguous | constrained |
| LWG 2401 | C++11 | assignment operator(3) fromstd::nullptr_t not required to be noexcept | required |
| replaces or destroys the target (public member function of std::move_only_function)[edit] | |
(removed in C++17) | assigns a new target (public member function)[edit] |