2012-01-27 2 views
3

Je suis sûr que certaines de mes questions ont déjà été posées, alors faites le moi savoir :).Surcharge de l'opérateur et conversion implicite en bool par rapport à l'idiome de sécurité booléen

D'abord, un exemple:

#include <iostream> 
struct A 
{ 
    typedef void (A::*funcptr)(); 
    operator funcptr() { 
     std::cout << "funcptr" << std::endl; 
    } 
}; 

int main() 
{ 
    A a; 
    if (a) {} 
} 

À if(a), operator funcptr() est appelé, mais je ne sais pas exactement ce qui se passe ici. Je suppose que le compilateur cherche une conversion d'un A à bool et trouve operator functptr ce qui est correct, mais comment fonctionne la conversion avec des pointeurs sur les fonctions membres?

De plus, si je l'ai changé operator funcptr() à operator int A::*() il serait également fonctionner, mais ne operator void A::* pas (je reçois cannot declare pointer to 'void' member), quelle est la règle que je suis absent là? (Mes questions sont principalement liées à essayer de comprendre pleinement l'idiot de bool sécurité)

En outre, si j'ai déclaré operator bool() il aurait préséance, alors quelles sont les règles de préséance?

+3

C'est votre travail de retourner un 'funcptr' de' opérateur funcptr' par la manière –

+0

@SethCarnegie: Bon, c'est juste un exemple illustrant mes questions. –

Répondre

2

Pour répondre à votre deuxième question, si vous utilisez

operator int A::*() { } 

alors vous créez un opérateur de conversion qui renvoie un pointeur vers un membre int. Pas un pointeur vers une fonction membre. Puisque vous ne pouvez pas avoir des membres de type void,

operator void A::*() { } 

n'est pas valide.

+0

Merci, je vois les différences maintenant, 'int A :: *()' renvoie un pointeur vers un membre int alors que 'opérateur functptr()' renvoie un pointeur vers une fonction membre. –

+0

Je sais que vous devriez utiliser un typedef pour le pointeur vers les fonctions membres, mais à quoi cela ressemblerait-il sans le typedef? –

+0

Je crois que ce serait (A :: * opérateur void())() {...} mais ce n'est peut-être pas légal. –

Questions connexes