5

Nell'esempio seguente, quale funzione di conversione dovrebbe essere chiamata? Perché questo dovrebbe essere scelto rispetto all'altro?Se il primo operando di un'espressione additiva è convertibile sia in puntatore sia in intero, quale conversione viene scelta?

struct A 
{ 
    operator int(); 
    operator int*(); 
}; 

A x; 
int i = x + 1; 

Il compilatore sceglie operator int() .. ma perché?

Ecco alcune citazioni importanti da C++ 03:

Da [expr.add]

Per Inoltre, sia entrambi gli operandi avranno l'aritmetica o tipo di enumerazione, o un operando deve essere un puntatore a un tipo di oggetto completamente definito e l'altro deve avere tipo integrale o di enumerazione.

Da [CONV]

espressioni con un determinato tipo saranno implicitamente convertiti in altri tipi in diversi contesti:

  • Quando viene utilizzato come operandi degli operatori. esigenze dell'operatore per i suoi operandi dettare il tipo di destinazione
+2

Direi che questo dovrebbe essere ambiguo. Non penso * che i non-puntatori siano più speciali. – chris

+0

Chiama l'altro se dici 'int * i = x + 1;'? – John

+0

@John, No, si lamenta solo di 'int -> int *'. – chris

risposta

9

La ragione di questo comportamento è che il built-in operatore che accetta un puntatore come operando sinistro accetta un oggetto del tipo std::ptrdiff_t come operando destro mano . Questo è specificato nel § 13.6 del C++ 11 standard:

Per ogni cv qualificato o cv-qualificato tipo di oggetto T esistono funzioni operatore candidati forma

T * operator+(T *, std::ptrdiff_t); 

[.. .]

da 1 ha tipo int, il compilatore considera incorporato operator + che prende due int s come una scelta migliore, in quanto necessita di onlys conver (definito dall'utente) sione per il primo argomento.

Se hai fornito un argomento di tipo std::ptrdiff_t come il diritto operando mano operator +, si vedrebbe l'ambiguità previsto:

int i = x + static_cast<std::ptrdiff_t>(1); // AMBIGUOUS! 

Ecco un live example.

+0

Buona chiamata. Dove è specificato che la risoluzione di sovraccarico dovrebbe essere utilizzata in questo scenario? – willj

+0

@willj: ho appena spento il mio portatile e sto scrivendo dal mio cellulare, quindi non posso dire il numero esatto del paragrafo, ma è da qualche parte nella clausola 13. Suggerisco di cercare le occorrenze di "operatore" in quel clausola, non dovrebbe essere difficile da trovare –

+0

13.6 inizia "Le funzioni operatore candidate che rappresentano gli operatori integrati definiti nella clausola 5 sono specificate in in questo sottoprouso Queste funzioni candidate partecipano al processo di risoluzione dell'overload dell'operatore come descritto in in 13.3.1.2 e non sono utilizzate per altri scopi ". –