Namespaces
Variants

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

Depuis fr.cppreference.net
 
 
Bibliothèque d'utilitaires
Support du langage
Support des types (types de base, RTTI)
Macros de test de fonctionnalités de la bibliothèque (C++20)
Utilitaires de programme
Fonctions variadiques
Support des coroutines (C++20)
Support des contrats (C++26)
Comparaison à trois voies
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilitaires généraux
Opérateurs relationnels (obsolète en C++20)
 
Objets fonction
Invocation de fonction
(C++17)(C++23)
Objet fonction identité
(C++20)
Encapsuleurs d'opérateurs transparents
(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)

Anciens adaptateurs et lieurs
(jusqu'à C++17*)
(jusqu'à C++17*)
(jusqu'à C++17*)
(jusqu'à C++17*)
(jusqu'à C++17*)  
(jusqu'à C++17*)
(jusqu'à C++17*)(jusqu'à C++17*)(jusqu'à C++17*)(jusqu'à C++17*)
(jusqu'à C++20*)
(jusqu'à C++20*)
(jusqu'à C++17*)(jusqu'à C++17*)
(jusqu'à C++17*)(jusqu'à C++17*)

(jusqu'à C++17*)
(jusqu'à C++17*)(jusqu'à C++17*)(jusqu'à C++17*)(jusqu'à C++17*)
(jusqu'à C++20*)
(jusqu'à C++20*)
 
 
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.

1,2) Crée un vide std::function.
3) Copie la cible de other vers la cible de *this.
Si other est vide, *this sera également vide juste après l'appel.
4) Déplace la cible de other vers la cible de *this.
Si 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.
5) Initialise la cible avec std::forward<F>(f). La cible est de type std::decay<F>::type.
Si 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.
Cette surcharge participe à la résolution de surcharge uniquement si toutes les conditions suivantes sont satisfaites :
  • std::is_same_v<std::remove_cvref_t<F>, std::function<R(Args...)> est false.
(depuis C++23)
  • Une lvalue de type std::decay<F>::type est appelable pour les types d'arguments Args... et le type de retour R.

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)
Si F n'est pas CopyConstructible, le comportement est indéfini.
6-10) Identique à (1-5) sauf que 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

3,8,9) 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é.
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)
5,10) Ne lance pas d'exception si f est un pointeur de fonction ou un std::reference_wrapper , sinon peut lancer std::bad_alloc ou toute exception levée par le constructeur de copie de l'objet appelable stocké.

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 )