Ci sono molte spiegazioni su come il compilatore interpreta questo codice, ma quello che probabilmente volevi sapere è ciò che hai sbagliato.
Sembra che ti aspetti il comportamento +
da std::string
. Il problema è che nessuno degli operandi in realtà è un std::string
. C++ analizza i tipi di operandi, non il tipo finale dell'espressione (qui il tipo restituito, std::string
) per risolvere l'overload. Non sceglierà la versione std::string
di +
se non vede uno std::string
.
Se si dispone di un comportamento speciale per un operatore (o lo ha scritto, o ottenuto una libreria che lo fornisce), tale comportamento si applica solo quando almeno uno degli operandi ha un tipo di classe (o un riferimento al tipo di classe e all'utente anche le enumerazioni definite contano).
Se hai scritto
std::string("") + c
o
std::string() + c
o
""s + c // requires C++14
allora si otterrebbe il std::string
comportamento dell'operatore +.
(Si noti che nessuno di questi sono in realtà buone soluzioni, perché tutti fanno di breve durata std::string
istanze che possono essere evitati con std::string(1, c)
)
La stessa cosa vale per le funzioni. Ecco un esempio:
std::complex<double> ipi = std::log(-1.0);
Otterrai un errore di runtime, invece del numero immaginario previsto. Questo perché il compilatore non ha idea che dovrebbe usare il logaritmo complesso qui. Il sovraccarico sembra solo agli argomenti e l'argomento è un numero reale (tipo double
, in realtà).
I sovraccarichi dell'operatore SONO funzioni e obbediscono alle stesse regole.
fonte
2014-09-12 17:31:13
Gli array si decompongono in puntatori. 'char's viene promosso a' int's. Segue l'aritmetica del puntatore. – chris
Per completare il commento di chris, '" "' viene letto come 'char []', invece di 'std :: string'. – Serge
Questo codice è equivalente a 'const char * str =" "; return & (str [(int) c]); '. Comportamento indefinito (a meno che C sia 0). – hyde