Namespaces
Variants

std::move_only_function

Von de.cppreference.net
 
 
Dienstprogrammbibliothek
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Koroutinenunterstützung (C++20)
Vertragsunterstützung (C++26)
Dreiseitiger Vergleich
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Allgemeine Dienstprogramme
Relationsoperatoren (veraltet in C++20)
Ganzzahl-Vergleichsfunktionen
(C++20)(C++20)(C++20)    
(C++20)
Swap und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Gebräuchliche Vokabular-Typen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
Funktionsobjekte
Funktionsaufruf
(C++17)(C++23)
Identitätsfunktionsobjekt
(C++20)
Transparente Operatorwrapper
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

Alte Binder und Adaptoren
(bis C++17*)
(bis C++17*)
(bis C++17*)
(bis C++17*)
(bis C++17*)(bis C++17*)(bis C++17*)(bis C++17*)
(bis C++20*)
(bis C++20*)
(bis C++17*)(bis C++17*)
(bis C++17*)(bis C++17*)

(bis C++17*)
(bis C++17*)(bis C++17*)(bis C++17*)(bis C++17*)
(bis C++20*)
(bis C++20*)
 
 
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

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)
nicht-besitzender Wrapper für jedes aufrufbare Objekt
(Klassentemplate)
kopierbarer Wrapper für jedes kopierkonstruierbare aufrufbare Objekt, das Qualifier in einer gegebenen Aufrufsignatur unterstützt
(Klassentemplate)