Nel codice seguente, mi aspetto di ottenere un errore del compilatore se più di un operatore di cast è definito a causa dell'ambiguità.Precedenza degli operatori di colata sovraccaricati
#include <iostream>
#include <sstream>
struct A
{
operator const char*() { return "hello world\n"; }
operator float() { return 123.0F; }
//operator int() { return 49; }
};
int main()
{
A a;
std::stringstream ss;
ss << a;
std::cout << ss.str();
return 0;
}
Invece, finché un solo operatore cast numerico viene definito, allora compila senza errori, nessun avviso, e il cast numerico viene utilizzato di preferenza alla operator const char *()
. L'ordine degli operatori dichiarati non fa differenza.
Tuttavia, se operator int()
e operator float()
sono entrambi definiti allora ottengo quello che mi aspettavo fin dall'inizio:
'operator <<' is ambiguous
ci sono delle regole di precedenza per i calchi, o perché fa il compilatore a scegliere il cast numerica di default? Capisco che dovrei dichiarare esplicitamente quale cast intendo, ma la mia domanda è sulla scelta di default che fa il compilatore.
Edit: usando il compilatore MSVC 2010
Non farei affidamento sul fatto che esiste una precedenza. Scrivi cosa intendi. Basta usare un cast esplicito. 'ss << statico_cast (a);' –
andre
Ho compilato il tuo esempio e g ++ mi dà "errore: sovraccarico ambiguo per 'operator <<' in 'ss << a'". Quindi, almeno g ++ funziona come previsto. –
Questo sembra essere dipendente dal compilatore. Quale compilatore stai usando? – SztupY