Comment std::bind fonctionne avec les fonctions de membre

Je travaille avec std::bind mais je ne comprends toujours pas comment cela fonctionne quand on l'utilise avec des membre des fonctions de classe.

Si nous avons la fonction suivante:

double my_divide (double x, double y) {return x/y;}

Je comprends parfaitement les lignes suivantes de code:

auto fn_half = std::bind (my_divide,_1,2);               //returns x/2

std::cout << fn_half(10) << '\n';                        //5

Mais maintenant, avec le code suivant, où nous avons le lier à la fonction de membre j'ai quelques questions.

struct Foo {
    void print_sum(int n1, int n2)
    {
        std::cout << n1+n2 << '\n';
    }
    int data = 10;
};

Foo foo;

auto f = std::bind(&Foo::print_sum, &foo, 95, _1);
f(5);
  • Pourquoi le premier argument est une référence? J'aimerais avoir une explication théorique.
  • Le deuxième argument est une référence à l'objet et c'est pour moi la partie la plus compliquée à comprendre. Je pense que c'est parce que std::bind a besoin d'un contexte, ai-je le droit? Est toujours comme ça? A std::bind une sorte de mise en œuvre, nécessitent une référence quand le premier argument est une fonction membre?
Un & suivie par un identificateur ne signifie pas "de référence". Non, sauf si c'est la déclaration d'une variable, auquel cas le & sera précédée par une typename. Lorsque & est appliqué à un identifiant, vous obtenez un pointeur.
En général, évitez d'utiliser std::bind. Il a quelques très profonde bizarreries qui font produire des résultats surprenants, même une fois que vous maîtrisez les principes de base. Je trouve qu'il ne vaut pas le coup.

OriginalL'auteur Tarod | 2016-06-05