Perché funzioni membro conversione implicita sovraccarico di lavoro per tipo di ritorno, mentre non è consentito per le normali funzioni?
-
13-09-2019 - |
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
}
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.