operador de conversión sobrecarga ambigüedad, compiladores difieren
He visto otras preguntas sobre SO con respecto a esto, pero ninguna que lo explique por completo. Cuál es elCorrecto ¿Cómo pueden los compiladores manejar las dos situaciones a continuación? Lo he probado con gcc 4.7.1 (con -std = c ++ 0x), VS2010 y VS2012 y obtengo resultados diferentes en todos:
Ejemplo 1:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{
BB b;
string s = b;
}
Salida:
gcc 4.7.1: okVS2010: OkVS2012: Error: "No se puede convertir de BB a cadena"Ejemplo 2:
struct BB
{
// generic cast
template<typename T>
operator T() const
{
return 0;
}
// string cast
operator std::string() const
{
return string("hello");
}
};
int main()
{
BB b;
string s = (string)b;
Salida:
gcc 4.7.1: Fallo: la llamada de cadena sobrecargada (BB &) es ambiguaVS2010: OkVS2012: Error: "No se puede convertir de BB a cadena"