Además de la mala elección para un ejemplo (probablemente tiene sentido tener int x = to<int>("1235")
en lugar de toString
), el problema es que el tipo de retorno no participa en la resolución de sobrecarga o la inferencia de tipos [1]. La razón de esto es que la expresión se puede utilizar en muchos lugares en los que el tipo de la devolución no se puede deducir:
// assuming template <typename T> T to(std::string):
//
f(to("123")); // where there are two overloads f(int), f(double)
int x = 1.5 * to("123"); // T == int? T == double?
to("123"); // now what? returned object can be ignored!
Así que la decisión es que el tipo de retorno no tomará parte en la resolución de sobrecarga o el tipo de deducción.
[1] Hay una sola excepción a esta regla, que es la evaluación de un puntero de función con más de una sobrecarga, en el que la sobrecarga se debe seleccionar ya sea por el puntero de destino o una conversión explícita, pero esto es solo la única excepción y no se usa en ningún otro contexto:
void f();
void f(int);
void g(void (*)());
void g(void (*)(int));
void (*p1)() = &f; // overload selected based on destination type
void (*p2)(int) = &f;
g((void (*)(int))&f); // overload selected based on explicit cast
¿Por qué es algo que se puede convertir en un entero llamado "toString"? –
[Esta pregunta] (http: // stackoverflow.com/questions/442026/function-overloading-by-return-type) discute un problema similar. –
"Simplemente no". Tenga en cuenta que este es el lenguaje, no el compilador, aunque en realidad no está especificado en el lenguaje en parte porque sería complicado para el compilador en el caso general. –