std::function<R(Args...)>::operator=
Von cppreference.com
< cpp | utility | functional | function
| function& operator=( const function& other ); |
(1) | (seit C++11) |
| function& operator=( function&& other ); |
(2) | (seit C++11) |
function& operator=( std::nullptr_t ) noexcept; |
(3) | (seit C++11) |
template< class F > function& operator=( F&& f ); |
(4) | (seit C++11) |
| template< class F > function& operator=( std::reference_wrapper<F> f ) noexcept; |
(5) | (seit C++11) |
Weist ein neues *target* an std::function zu.
1) Weist eine Kopie des *target* von other zu, als ob durch Ausführung von function(other).swap(*this);.
2) Verschiebt das *target* von other nach *this. other befindet sich in einem gültigen Zustand mit einem nicht spezifizierten Wert.
3) Verwirft das aktuelle *target*. *this ist nach dem Aufruf *leer*.
4) Setzt das *target* von *this auf den aufrufbaren f, als ob durch Ausführung von function(std::forward<F>(f)).swap(*this);. Dieser Operator nimmt nicht an der Overload-Auflösung teil, es sei denn, f ist Callable für die Argumenttypen
Args... und den Rückgabetyp R.5) Setzt das *target* von *this auf eine Kopie von f, als ob durch Ausführung von function(f).swap(*this);.
Inhalt |
[edit] Parameter
| Sonstiges | - | ein weiteres std::function Objekt, von dem das target kopiert werden soll |
| f | - | ein aufrufbares Objekt, mit dem das *target* initialisiert werden soll |
| Typanforderungen | ||
-F muss die Anforderungen an Callable erfüllen. | ||
[edit] Rückgabewert
*this
[edit] Anmerkungen
Selbst bevor die Unterstützung für Allokatoren aus std::function in C++17 entfernt wurde, verwenden diese Zuweisungsoperatoren den Standardallokator anstelle des Allokators von *this oder des Allokators von other (siehe LWG issue 2386).
[edit] Beispiel
Führen Sie diesen Code aus
#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); }
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2132 | C++11 | der Überladungsoperator (4), der ein Callable-Objekt annimmt, könnte mehrdeutig sein | eingeschränkt |
| LWG 2401 | C++11 | Zuweisungsoperator (3) von std::nullptr_t muss nicht unbedingt noexcept sein |
Gefordert |
[edit] Siehe auch
| ersetzt oder zerstört das Ziel (public member function of std::move_only_function) | |
| (removed in C++17) |
weist ein neues Ziel zu (public member function) |