Perché funzioni membro conversione implicita sovraccarico di lavoro per tipo di ritorno, mentre non è consentito per le normali funzioni?

StackOverflow https://stackoverflow.com/questions/1128501

Domanda

C ++ non consente il polimorfismo per i metodi in base al loro tipo di ritorno. Tuttavia, quando il sovraccarico una funzione membro di conversione implicita sembra possibile.

Qualcuno sa perché? Ho pensato operatori vengono gestiti come i metodi internamente.

Edit: Ecco un esempio:

struct func {
    operator string() { return "1";}
    operator int() { return 2; }
};

int main( ) {
    int x    = func(); // calls int version
    string y = func(); // calls string version
    double d = func(); // calls int version
    cout << func() << endl; // calls int version
}
È stato utile?

Soluzione

operatori di conversione non sono realmente considerati diversi sovraccarichi e non sono chiamati basano su il loro tipo di ritorno . Il compilatore usarli solo quando deve (quando il tipo è incompatibile e deve essere convertito) o quando esplicitamente chiesto di usare uno di loro con un operatore cast.

semantico, ciò che il codice sta facendo è quello di dichiarare diversi operatori diverso di conversione tipo e non sovraccarichi di un singolo operatore .

Altri suggerimenti

Questo non è il tipo di ritorno. Questo è il tipo di conversione.

Si consideri: func () crea un oggetto di tipo func. Non v'è alcuna ambiguità da quale metodo (costruttore) verrà invocato.

L'unica domanda che rimane è se è possibile lanciarlo ai tipi desiderati. È fornito con il compilatore di conversione appropriato, quindi è felice.

non c'è davvero una ragione tecnica per evitare di sovraccaricare di funzioni sui tipi di risultato. Questo viene fatto in alcune lingue come Ada, per esempio, ma nel contesto di C ++ che ha anche le conversioni implicite (e due tipi di loro), l'utilità è ridotta, e le interazioni di entrambe le caratteristiche sarebbe porta rapidamente ad ambiguità.

Si noti che è possibile utilizzare il fatto che le conversioni implicite sono definibili dall'utente per simulare il sovraccarico sul tipo di risultato:

class CallFProxy;
CallFProxy f(int);

class CallFProxy {
   int myParameter;
   CallFProxy(int i) : myParameter(i) {}
public:
   operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
   operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};

risoluzione di sovraccarico sceglie tra più funzioni candidati. In questo processo, il tipo di ritorno dei candidati è infatti non è considerato. Tuttavia, nel caso di operatori di conversione del "tipo di ritorno" è criticamente importante nel determinare se tale operatore è un candidato affatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top