5
struct A 
{ 
    void f() {} 
}; 

void f() {} 

int main() 
{ 
    auto p1 = &f;  // ok 
    auto p2 = f;  // ok 
    auto p3 = &A::f; // ok 

    // 
    // error : call to non-static member function 
    // without an object argument 
    // 
    auto p4 = A::f; // Why not ok? 
} 

Pourquoi dois-je utiliser l'opérateur address-of pour obtenir un pointeur sur une fonction membre?Pourquoi dois-je utiliser l'opérateur address-of pour obtenir un pointeur sur une fonction membre?

+0

Qu'est-ce que vous essayez de faire ici? Pourquoi auriez-vous besoin de l'adresse d'une fonction membre, et si vous aviez une telle chose, que feriez-vous avec? – tadman

+0

par exemple. 'std :: bind (& A :: f, A());' – xmllmx

+1

Également lors de la transmission d'une fonction membre à 'std :: thread'. –

Répondre

3
auto p1 = &f;  // ok 
auto p2 = f;  // ok 

Le premier est plus ou moins la bonne chose. Mais parce que les fonctions non-membres ont implicit conversions aux pointeurs, le & n'est pas nécessaire. C++ fait cette conversion, même applies aux fonctions membres statiques.

Pour citer cppreference:

Une lvalue de type fonction T peut être converti implicitement à un pointeur prvalue à cette fonction. Cela ne s'applique pas aux fonctions non statiques car les lvalues ​​qui font référence à des fonctions membres non statiques n'existent pas .