Il seguente C++ compila senza avvisi a tutti i compilatori che ho provato (GCC 4.6.3, LLVM 3.0, ICC 13.1.1, SolarisStudio 12.1/12.3):Diversi operatori di fusione utilizzate da diversi compilatori
struct CClass
{
template<class T>
operator T() const { return 1; }
operator int() const { return 2; }
};
int main(void)
{
CClass x;
return static_cast<char>(x);
}
Tuttavia, tutti tranne i compilatori SolarisStudio restituiscono 2, SolarisStudio (versione) restituisce 1, che considererei il risultato più logico.
Utilizzando return x.operator char();
risultati in tutti i compilatori ritorno 1.
Ovviamente, dal momento che per capire questo fuori, ho utilizzato la seconda notazione. Tuttavia, mi piacerebbe sapere quale compilatore è corretto e perché. (Si potrebbe pensare che regole di maggioranza, ma questo ancora non spiega il motivo per cui .)
Questa domanda sembra essere correlato alle domande in modo here, here e here, ma questi "solo" dare soluzioni a problemi, senza spiegazioni (che sono stato in grado di applicare comunque al mio particolare problema).
Si noti che aggiungendo un operatore di colata sovraccarico aggiuntivo, ad esempio i risultati in tutti i compilatori eccetto SolarisStudio lamentandosi dell'ambiguità.
Appena testato nel mio compilatore, G ++ 4.8.0, e restituisce 1. – rodrigo
G ++ 4.7.2 restituisce anche 1. E con 'operator float()', non vi è alcun reclamo in merito a qualsiasi ambiguità. – hvd
g ++ ne restituisce uno a partire da 4.7 http://gcc.godbolt.org/ – Riga