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) |
function( function&& other );
|
(4) | (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é en C++17) |
template< class Alloc >
function( std::allocator_arg_t, const Alloc& alloc,
std::nullptr_t ) noexcept;
|
(7) | (depuis C++11) (supprimé en C++17) |
template< class Alloc >
function( std::allocator_arg_t, const Alloc& alloc,
const function& other );
|
(8) | (depuis C++11) (supprimé en C++17) |
template< class Alloc >
function( std::allocator_arg_t, const Alloc& alloc,
function&& other );
|
(9) | (depuis C++11) (supprimé en C++17) |
template< class F, class Alloc >
function( std::allocator_arg_t, const Alloc& alloc, F f );
|
(10) | (depuis C++11) (supprimé en C++17) |
Construit un std::function à partir de diverses sources.
other est vide, *this sera également vide juste après l'appel.other vers la cible de *this.other est vide, *this sera également vide juste après l'appel.other se trouve dans un état valide mais non spécifié juste après l'appel.std::forward<F>(f). La cible est de type std::decay<F>::type.f est un pointeur nul vers une fonction, un pointeur nul vers un membre, ou une valeur vide d'une certaine spécialisation de std::function, *this sera vide juste après l'appel.
|
(depuis C++23) |
- Une lvalue de type
std::decay<F>::typeest appelable pour les types d'argumentsArgs...et le type de retourR.
|
Si |
(depuis C++23) |
F n'est pas CopyConstructible, le comportement est indéfini.alloc est utilisé pour allouer de la mémoire pour toutes les structures de données internes que le 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. D'autres objets volumineux peuvent être construits dans un stockage alloué dynamiquement et accessibles par l'objet std::function via un pointeur.
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
)
|