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) |
| (4) | ||
|
function
(
function
&&
other
)
;
|
(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,
|
(7) |
(seit C++11)
(entfernt in C++17) |
|
template
<
class
Alloc
>
function
(
std::
allocator_arg_t
,
const
Alloc
&
alloc,
|
(8) |
(seit C++11)
(entfernt in C++17) |
|
template
<
class
Alloc
>
function
(
std::
allocator_arg_t
,
const
Alloc
&
alloc,
|
(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 verschiedenen Quellen.
std::function
Spezialisierung ist,
*
this
wird unmittelbar nach dem Aufruf leer sein.
|
(seit C++23) |
-
Ein Lvalue vom Typ
std::
decay
<
F
>
::
type
ist aufrufbar für Argumenttypen
Args...und RückgabetypR.
|
Falls std:: is_copy_constructible_v < std:: decay_t < F >> oder std:: is_constructible_v < std:: decay_t < F > , F > den Wert false hat, ist das Programm fehlerhaft. |
(seit C++23) |
std::function
verwenden könnte.
Wenn das Ziel ein Funktionszeiger oder ein std::reference_wrapper ist, ist die Small-Object-Optimierung garantiert, das heißt, diese Ziele werden immer direkt innerhalb des std::function -Objekts gespeichert, es findet keine dynamische Speicherallokation statt. Andere große Objekte können im dynamisch allokierten Speicher konstruiert werden und werden durch das std::function -Objekt über einen Zeiger angesprochen.
Inhaltsverzeichnis |
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
)
|