std::function<R(Args...)>:: function
|
function
(
)
noexcept
;
|
(1) | (depuis C++11) |
|
function
(
std::
nullptr_t
)
noexcept
;
|
(2) | (depuis C++11) |
|
function
(
const
function
&
other
)
;
|
(3) | (depuis C++11) |
| (4) | ||
|
function
(
function
&&
other
)
;
|
(depuis C++11)
(jusqu'à C++20) |
|
|
function
(
function
&&
other
)
noexcept
;
|
(depuis C++20) | |
|
template
<
class
F
>
function ( F && f ) ; |
(5) | (depuis C++11) |
|
template
<
class
Alloc
>
function ( std:: allocator_arg_t , const Alloc & alloc ) noexcept ; |
(6) |
(depuis C++11)
(supprimé dans C++17) |
|
template
<
class
Alloc
>
function
(
std::
allocator_arg_t
,
const
Alloc
&
alloc,
|
(7) |
(depuis C++11)
(supprimé dans C++17) |
|
template
<
class
Alloc
>
function
(
std::
allocator_arg_t
,
const
Alloc
&
alloc,
|
(8) |
(depuis C++11)
(supprimé dans C++17) |
|
template
<
class
Alloc
>
function
(
std::
allocator_arg_t
,
const
Alloc
&
alloc,
|
(9) |
(depuis C++11)
(supprimé dans C++17) |
|
template
<
class
F,
class
Alloc
>
function ( std:: allocator_arg_t , const Alloc & alloc, F f ) ; |
(10) |
(depuis C++11)
(supprimé dans C++17) |
Construit un
std::function
à partir de diverses sources.
std::function
,
*
this
sera vide immédiatement après l'appel.
|
(depuis C++23) |
-
Une lvalue de type
std::
decay
<
F
>
::
type
est appelable pour les types d'arguments
Args...et le type de retourR.
|
Si std:: is_copy_constructible_v < std:: decay_t < F >> ou std:: is_constructible_v < std:: decay_t < F > , F > est false , le programme est mal formé. |
(depuis C++23) |
std::function
pourrait utiliser.
Lorsque la cible est un pointeur de fonction ou un std::reference_wrapper , l'optimisation des petits objets est garantie, c'est-à-dire que ces cibles sont toujours stockées directement à l'intérieur de l'objet std::function , aucune allocation dynamique n'a lieu. Les autres objets volumineux peuvent être construits dans un stockage alloué dynamiquement et accessibles par l'objet std::function via un pointeur.
Table des matières |
Paramètres
| other | - | l'objet fonction utilisé pour initialiser * this |
| f | - | un objet appelable utilisé pour initialiser * this |
| alloc | - | un Allocator utilisé pour l'allocation de mémoire interne |
| Exigences de type | ||
-
Alloc
doit satisfaire aux exigences de
Allocator
.
|
||
Exceptions
|
4)
Ne lance pas d'exception si
other
a pour cible un pointeur de fonction ou un
std::reference_wrapper
, sinon peut lancer
std::bad_alloc
ou toute exception levée par le constructeur utilisé pour copier ou déplacer l'objet appelable stocké.
|
(until C++20) |
Notes
std::function
's prise en charge des allocateurs était mal spécifiée et mise en œuvre de manière incohérente. Certaines implémentations ne fournissent pas du tout les surcharges
(
6-10
)
, certaines fournissent les surcharges mais ignorent l'argument d'allocateur fourni, et certaines fournissent les surcharges et utilisent l'allocateur fourni pour la construction mais pas lorsque le
std::function
est réaffecté. En conséquence, la prise en charge des allocateurs a été supprimée en C++17.
Exemple
#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) constructeur vide try { func1(333 << 1); } catch (const std::bad_function_call& ex) { std::cout << "1) " << ex.what() << '\n'; } std::function<void(int)> func2{nullptr}; // (2) constructeur vide try { func1(222 * 3); } catch (const std::bad_function_call& ex) { std::cout << "2) " << ex.what() << '\n'; } func1 = print_num; // initialise func1 en utilisant l'opérateur d'affectation std::function<void(int)> func3{func1}; // (3) constructeur de copie func3(33); std::function<void(int)> func4{std::move(func3)}; // (4) constructeur de déplacement, // func3 dans un état non spécifié func4(44); std::function<void(int)> func5{print_num}; // (5) constructeur avec fonction func5(55); // (5) constructeur avec lambda std::function<void(int)> func6([](int i) { std::cout << "lambda(" << i << ")\n"; }); func6(66); }
Sortie possible :
1) bad_function_call 2) bad_function_call print_num(33) print_num(44) print_num(55) lambda(66)
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 2132 | C++11 | les surcharges ( 5,10 ) pouvaient être ambiguës | contraintes |
| LWG 2774 | C++11 | ( 5,10 ) effectuait un déplacement supplémentaire | éliminé |
Voir aussi
construit un nouvel objet
std::move_only_function
(fonction membre publique de
std::move_only_function
)
|