Namensräume
Varianten
Aktionen

std::move_only_function

Von cppreference.com
< cpp‎ | utility‎ | functional
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
Funktionsobjekte
Funktions-Wrapper
(C++11)
move_only_function
(C++23)
(C++11)
Funktionsaufruf
(C++17)(C++23)
Identitätsfunktions-Objekt
(C++20)
Transparente Operator-Wrapper
(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 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...)>;
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 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) [bearbeiten]
zerstört ein std::move_only_function-Objekt
(public member function) [bearbeiten]
ersetzt oder zerstört das Ziel
(public member function) [bearbeiten]
tauscht die Ziele zweier std::move_only_function-Objekte
(public member function) [bearbeiten]
prüft, ob das std::move_only_function ein Ziel hat
(public member function) [bearbeiten]
ruft das Ziel auf
(public member function) [bearbeiten]

[Abschnitt bearbeiten] Nicht-Mitgliedsfunktionen

spezialisiert den Algorithmus std::swap
(Funktion) [edit]
vergleicht ein std::move_only_function mit nullptr
(function) [bearbeiten]

[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) [bearbeiten]
nicht-besitzender Wrapper für jedes aufrufbare Objekt
(Klassen-Template) [bearbeiten]
kopierfähiger Wrapper für jedes kopierkonstruierbare aufrufbare Objekt, das Qualifizierer in einer gegebenen Aufrufsignatur unterstützt
(Klassen-Template) [bearbeiten]