Namespaces
Variants

std::function<R(Args...)>::function

Aus de.cppreference.net
 
 
Hilfsmittelbibliothek
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programmhilfsmittel
Variadische Funktionen
Koroutinen-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 (veraltet in C++20)
Funktionen zum Integer-Vergleich
(C++20)(C++20)(C++20)    
(C++20)
swap- und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Allgemeine Vokabultypen
(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*)
 
 
function() noexcept;
(1) (seit C++11)
function( std::nullptr_t ) noexcept;
(2) (seit C++11)
function( const function& other );
(3) (seit C++11)
function( function&& other );
(4) (seit C++11)
(bis C++20)
function( function&& other ) noexcept;
(seit C++20)
template< class F > 
function( F&& f );
(5) (seit C++11)
template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc ) noexcept;
(6) (seit C++11)
(entfernt in C++17)
template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, 
          std::nullptr_t ) noexcept;
(7) (seit C++11)
(entfernt in C++17)
template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, 
          const function& other );
(8) (seit C++11)
(entfernt in C++17)
template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, 
          function&& other );
(9) (seit C++11)
(entfernt in C++17)
template< class F, class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, F f );
(10) (seit C++11)
(entfernt in C++17)

Konstruiert ein std::function aus einer Vielzahl von Quellen.

1,2) Erzeugt ein leeres std::function.
3) Kopiert das Ziel von other in das Ziel von *this.
Falls other leer ist, wird *this auch unmittelbar nach dem Aufruf leer sein.
4) Verschiebt das Ziel von other in das Ziel von *this.
Falls other leer ist, wird *this auch unmittelbar nach dem Aufruf leer sein.
other befindet sich unmittelbar nach dem Aufruf in einem gültigen, aber nicht näher spezifizierten Zustand.
5) Initialisiert das Ziel mit std::forward<F>(f). Das Ziel ist vom Typ std::decay<F>::type.
Falls f ein Nullzeiger auf eine Funktion, ein Nullzeiger auf ein Element oder ein leerer Wert einer std::function-Spezialisierung ist, wird *this unmittelbar nach dem Aufruf leer sein.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn alle folgenden Bedingungen erfüllt sind:
  • std::is_same_v<std::remove_cvref_t<F>, std::function<R(Args...)> ist false.
(seit C++23)
  • Ein L-Wert vom Typ std::decay<F>::type ist für die Argumenttypen Args... und den Rückgabetyp R aufrufbar.

Falls std::is_copy_constructible_v<std::decay_t<F>> oder std::is_constructible_v<std::decay_t<F>, F> false ist, ist das Programm fehlerhaft.

(seit C++23)
Falls F nicht CopyConstructible ist, ist das Verhalten undefiniert.
6-10) Wie (1-5), außer dass alloc verwendet wird, um Speicher für alle internen Datenstrukturen zu allokieren, die das std::function möglicherweise verwendet.

Wenn das Ziel ein Funktionszeiger oder ein std::reference_wrapper ist, ist eine Optimierung für kleine Objekte garantiert, d.h., diese Ziele werden immer direkt innerhalb des std::function-Objekts gespeichert, es findet keine dynamische Allokation statt. Andere große Objekte können im dynamisch allokierten Speicher konstruiert und über einen Zeiger durch das std::function-Objekt zugegriffen werden.

Parameter

other - das Funktionsobjekt, das zur Initialisierung von * this verwendet wird
f - ein aufrufbares Objekt, das zur Initialisierung von * this verwendet wird
alloc - ein Allocator , der für interne Speicherzuweisung verwendet wird
Typanforderungen
-
Alloc muss die Anforderungen von Allocator erfüllen.

Ausnahmen

3,8,9) Wirft keine Ausnahme, falls other 's Ziel ein Funktionszeiger oder ein std::reference_wrapper ist, andernfalls kann std::bad_alloc oder eine beliebige Ausnahme geworfen werden, die vom Konstruktor ausgelöst wird, der zum Kopieren oder Verschieben des gespeicherten aufrufbaren Objekts verwendet wird.
4) Wirft keine Ausnahme, wenn other 's Ziel ein Funktionszeiger oder ein std::reference_wrapper ist, andernfalls kann std::bad_alloc oder jede Ausnahme geworfen werden, die vom Konstruktor ausgelöst wird, der zum Kopieren oder Verschieben des gespeicherten aufrufbaren Objekts verwendet wird.
(until C++20)
5,10) Wirft keine Ausnahme, falls f ein Funktionszeiger oder ein std::reference_wrapper ist, andernfalls kann std::bad_alloc oder jede durch den Kopierkonstruktor des gespeicherten aufrufbaren Objekts ausgelöste Ausnahme geworfen werden.

Hinweise

std::function 's Allokatorunterstützung war schlecht spezifiziert und inkonsistent implementiert. Einige Implementierungen bieten die Überladungen ( 6-10 ) überhaupt nicht an, einige bieten die Überladungen an, ignorieren jedoch das übergebene Allokatorargument, und einige bieten die Überladungen an und verwenden den übergebenen Allokator für die Konstruktion, jedoch nicht, wenn das std::function neu zugewiesen wird. Infolgedessen wurde die Allokatorunterstützung in C++17 entfernt.

Beispiel

#include <functional>
#include <iostream>
#include <utility>
void print_num(int i) { std::cout << "print_num(" << i << ")\n"; }
int main()
{
    std::function<void(int)> func1; // (1) leerer Konstruktor
    try
    {
        func1(333 << 1);
    }
    catch (const std::bad_function_call& ex)
    {
        std::cout << "1) " << ex.what() << '\n';
    }
    std::function<void(int)> func2{nullptr}; // (2) leerer Konstruktor
    try
    {
        func1(222 * 3);
    }
    catch (const std::bad_function_call& ex)
    {
        std::cout << "2) " << ex.what() << '\n';
    }
    func1 = print_num; // initialisiert func1 mit Zuweisungsoperator
    std::function<void(int)> func3{func1}; // (3) Kopierkonstruktor
    func3(33);
    std::function<void(int)> func4{std::move(func3)}; // (4) Move-Konstruktor,
                                                      // func3 in nicht spezifiziertem Zustand
    func4(44);
    std::function<void(int)> func5{print_num}; // (5) Konstruktor mit Funktion
    func5(55);
    // (5) Konstruktor mit Lambda
    std::function<void(int)> func6([](int i) { std::cout << "lambda(" << i << ")\n"; });
    func6(66);
}

Mögliche Ausgabe:

1) bad_function_call
2) bad_function_call
print_num(33)
print_num(44)
print_num(55)
lambda(66)

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 Überladungen ( 5,10 ) könnten mehrdeutig sein eingeschränkt
LWG 2774 C++11 ( 5,10 ) führte eine zusätzliche Verschiebung aus entfernt

Siehe auch

Konstruiert ein neues std::move_only_function Objekt
(Öffentliche Mitgliedsfunktion von std::move_only_function )