std::move_only_function
| Definiert in Header <functional>
|
||
template< class... >
class move_only_function; // not defined
|
(1) | (seit C++23) |
template< class R, class... Args >
class move_only_function<R(Args...)>;
template< class R, class... Args >
class move_only_function<R(Args...) noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) &>;
template< class R, class... Args >
class move_only_function<R(Args...) & noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) &&>;
template< class R, class... Args >
class move_only_function<R(Args...) && noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) const>;
template< class R, class... Args >
class move_only_function<R(Args...) const noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) const &>;
template< class R, class... Args >
class move_only_function<R(Args...) const & noexcept>;
template< class R, class... Args >
class move_only_function<R(Args...) const &&>;
template< class R, class... Args >
class move_only_function<R(Args...) const && noexcept>;
|
(2) | (seit C++23) |
Die Klassenschablone std::move_only_function ist ein universeller polymorpher Funktionswrapper. std::move_only_function-Objekte können jedes konstruierbare (nicht notwendigerweise verschiebekonstruierbare) aufrufbare Ziel speichern und aufrufen — Funktionen, Lambda-Ausdrücke, Bind-Ausdrücke oder andere Funktionsobjekte, sowie Zeiger auf Mitgliedsfunktionen und Zeiger auf Mitgliedsdatenobjekte.
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-Objekts zu undefiniertem Verhalten.
std::move_only_function unterstützt jede mögliche Kombination von cv-Qualifizierern (ohne volatile), Ref-Qualifizierern und noexcept-Spezifizierern, die in seinem Template-Parameter angegeben sind. Diese Qualifizierer und Spezifizierer (sofern vorhanden) werden zu dessen operator() hinzugefügt.
std::move_only_function erfüllt die Anforderungen von MoveConstructible und MoveAssignable, erfüllt aber nicht CopyConstructible oder CopyAssignable.
Mitgliedertypen
| Typ | Definition |
result_type
|
R
|
Memberfunktionen
konstruiert ein neues
std::move_only_function
Objekt
(öffentliche Elementfunktion) |
|
zerstört ein
std::move_only_function
Objekt
(öffentliche Elementfunktion) |
|
|
ersetzt oder zerstört das Zielobjekt
(öffentliche Elementfunktion) |
|
tauscht die Ziele zweier
std::move_only_function
Objekte
(öffentliche Elementfunktion) |
|
prüft ob die
std::move_only_function
ein Zielobjekt besitzt
(öffentliche Elementfunktion) |
|
|
ruft das Zielobjekt auf
(öffentliche Elementfunktion) |
Nicht-Member-Funktionen
|
(C++23)
|
spezialisiert den
std::swap
Algorithmus
(Funktion) |
|
(C++23)
|
vergleicht ein
std::move_only_function
mit
nullptr
(Funktion) |
Hinweise
Implementierungen können ein aufrufbares Objekt kleiner Größe innerhalb des
std::move_only_function
Objekts speichern. Eine solche Small-Object-Optimierung ist effektiv für Funktionszeiger und
std::reference_wrapper
Spezialisierungen 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, von einer Funktion oder einem Funktionsobjekt initialisiert wird, das einen Prvalue zurückgibt (einschließlich eines Lambda-Ausdrucks ohne nachgestellten Rückgabetyp), ist das Programm fehlerhaft, da das Binden der zurückgegebenen Referenz an ein temporäres Objekt verboten ist. Siehe auch
std::function
Notes.
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_move_only_function
|
202110L
|
(C++23) |
std::move_only_function
|
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); // Fehler std::move_only_function<void()> function = std::move(lambda); // OK function(); std::cout << future.get(); }
Ausgabe:
3.14159
Siehe auch
|
(C++11)
|
kopierbarer Wrapper für jedes kopierkonstruierbare aufrufbare Objekt
(Klassentemplate) |
|
(C++26)
|
nicht-besitzender Wrapper für jedes aufrufbare Objekt
(Klassentemplate) |
|
(C++26)
|
kopierbarer Wrapper für jedes kopierkonstruierbare aufrufbare Objekt, das Qualifier in einer gegebenen Aufrufsignatur unterstützt
(Klassentemplate) |