std::function<R(Args...)>::function
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.
other leer ist, wird *this auch unmittelbar nach dem Aufruf leer sein.other in das Ziel von *this.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.std::forward<F>(f). Das Ziel ist vom Typ std::decay<F>::type.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.
|
(seit C++23) |
- Ein L-Wert vom Typ
std::decay<F>::typeist für die ArgumenttypenArgs...und den RückgabetypRaufrufbar.
|
Falls |
(seit C++23) |
F nicht CopyConstructible ist, ist das Verhalten undefiniert.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
|
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) |
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
)
|