std::move_only_function
| Definiert in der Header-Datei <functional> |
||
| template< class... > class move_only_function; // nicht definiert |
(1) | (seit C++23) |
| template< class R, class... Args > class move_only_function<R(Args...)>; |
(2) | (seit C++23) |
Die Klassenvorlage std::move_only_function ist ein generischer polymorpher Funktions-Wrapper. std::move_only_function-Objekte können jedes konstruierbare (nicht unbedingt verschiebbar konstruierbare) Callable-Objekt – Funktionen, Lambda-Ausdrücke, bind-Ausdrücke oder andere Funktions-Objekte sowie Zeiger auf Member-Funktionen und Zeiger auf Member-Daten – speichern und aufrufen.
Das gespeicherte aufrufbare Objekt wird als *Ziel* von std::move_only_function bezeichnet. Wenn ein std::move_only_function kein Ziel enthält, wird es als *leer* bezeichnet. Im Gegensatz zu std::function führt der Aufruf eines *leeren* std::move_only_function zu undefiniertem Verhalten.
std::move_only_function unterstützt jede mögliche Kombination von cv-Qualifizierern (außer volatile), ref-Qualifizierern und noexcept-Spezifizierern, die in seinem Vorlagenparameter angegeben sind. Diese Qualifizierer und Spezifizierer (falls vorhanden) werden seinem operator() hinzugefügt.
std::move_only_function erfüllt die Anforderungen von MoveConstructible und MoveAssignable, aber nicht die von CopyConstructible oder CopyAssignable.
Inhalt |
[Abschnitt bearbeiten] Mitgliedstypen
| Typ | Definition |
result_type
|
R
|
[Abschnitt bearbeiten] Mitgliedsfunktionen
erzeugt ein neues std::move_only_function-Objekt(public member function) | |
zerstört ein std::move_only_function-Objekt(public member function) | |
| ersetzt oder zerstört das Ziel (public member function) | |
tauscht die Ziele zweier std::move_only_function-Objekte(public member function) | |
prüft, ob das std::move_only_function ein Ziel hat(public member function) | |
| ruft das Ziel auf (public member function) |
[Abschnitt bearbeiten] Nicht-Mitgliedsfunktionen
| spezialisiert den Algorithmus std::swap (Funktion) | |
| (C++23) |
vergleicht ein std::move_only_function mit nullptr(function) |
[Abschnitt bearbeiten] Hinweise
Implementierungen können ein aufrufbares Objekt geringer Größe innerhalb des std::move_only_function-Objekts speichern. Eine solche Small-Object-Optimierung ist für Funktionszeiger und Spezialisierungen von std::reference_wrapper praktisch erforderlich und kann nur auf Typen T angewendet werden, für die std::is_nothrow_move_constructible_v<T> true ist.
Wenn ein std::move_only_function, das eine Referenz zurückgibt, aus einer Funktion oder einem Funktions-Objekt initialisiert wird, das ein prvalue zurückgibt (einschließlich eines Lambda-Ausdrucks ohne nachfolgenden Rückgabetyp), ist das Programm ill-formed, da das Binden der zurückgegebenen Referenz an ein temporäres Objekt verboten ist. Siehe auch std::function Hinweise.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_move_only_function |
202110L |
(C++23) | std::move_only_function
|
[Abschnitt bearbeiten] Beispiel
#include <functional> #include <future> #include <iostream> int main() { std::packaged_task<double()> packaged_task([](){ return 3.14159; }); std::future<double> future = packaged_task.get_future(); auto lambda = [task = std::move(packaged_task)]() mutable { task(); }; // std::function<void()> function = std::move(lambda); // Error std::move_only_function<void()> function = std::move(lambda); // OK function(); std::cout << future.get(); }
Ausgabe
3.14159
[Abschnitt bearbeiten] Siehe auch
| (C++11) |
kopierfähiger Wrapper für jedes kopierkonstruierbare aufrufbare Objekt (Klassen-Template) |
| (C++26) |
nicht-besitzender Wrapper für jedes aufrufbare Objekt (Klassen-Template) |
| (C++26) |
kopierfähiger Wrapper für jedes kopierkonstruierbare aufrufbare Objekt, das Qualifizierer in einer gegebenen Aufrufsignatur unterstützt (Klassen-Template) |