2017-02-16 1 views
0
struct test 
{ 
    void f() {}; 
}; 
test t1; 

using memfun_t = void (test::*)(); 
memfun_t mf = &test::f; 


auto a1 = &test::f; // OK 
auto a2 = t1.*mf; // error 
auto a3 = &(t1.*mf); // still no luck 

Des idées pour expliquer pourquoi cela ne peut être déduit? J'apprécierais les réponses faisant référence à la norme.automatique ne parvient pas à déduire?

Edit:

J'ai trouvé une extension du langage RAD Studio appelé __closure qui semble résoudre ce problème. 1 Voici le code:

class base { 
public: 
    void func(int x) { 
    }; 
}; 

typedef void(base::*pBaseMember)(int); 

class derived : public base { 
public: 
    void new_func(int i) { 
    }; 
}; 

int main(int argc, char * argv[]) { 
    derived derivedObject; 
    void(__closure * derivedClosure)(int); 

    // Get a pointer to the ‘new_func’ member. 
    // Note the closure is associated with the 
    // particular object, ‘derivedObject’. 
    derivedClosure = derivedObject.new_func; 

    derivedClosure(3); // Call ‘new_func’ through the closure. 
    return 0; 
} 

http://docwiki.embarcadero.com/RADStudio/Seattle/en/Closure

Répondre

1

Vous ne pouvez pas utiliser

auto a2 = t1.*mf; // error 

comme vous ne pouvez pas utiliser:

auto a2 = t1.f; 

t1.f n'est pas valide expression. Un pointeur vers une fonction membre ne peut pas être obtenu via une instance de la classe. Contrairement aux fonctions non membres, qui se réduisent à un pointeur de fonction lorsqu'elles sont utilisées de la sorte, les fonctions membres ne se désintègrent pas en un pointeur de fonction membre.

texte pertinent du C++ 11 Standard:

Opérateurs unaires

...

4 est formé seulement un pointeur vers un élément lorsque & explicite est utilisée et son opérande est un identifiant qualifié non inclus entre parenthèses. [Note: qui est, l'expression &(qualified-id), où le qualified-id est indiqué entre parenthèses, ne forme pas une expression de type « pointeur à un membre. » Ni ne qualified-id, parce qu'il n'y a pas de conversion implicite d'un -id qualifié pour une fonction membre non statique au type "pointeur vers fonction membre" comme il existe d'une lvalue de type fonction au type "pointeur vers fonction" (4.3). Il n'est pas &unqualified-id un pointeur sur un membre, même dans le cadre de la classe non qualifié-id. -end note]

+0

Eh bien c'est la question maintenant, n'est ce pas? Pourquoi ne devrait-il pas être capable de déduire un pointeur de fonction membre? – Lenz

+1

@Lenz, ce serait la question si 'mf' ne faisait pas partie de la poste. –

+0

@Lenz: Il ne peut pas déduire un pointeur de fonction membre car seules les expressions valides peuvent être déduites et ce n'est pas une expression valide. Pourquoi n'est-ce pas une expression valide? Parce que ce sont les règles des fonctions membres C++ et des pointeurs membres. –