Historia del tema
C++ fue diseñado desde el principio como un lenguaje que soporta la sobrecarga de funciones: la posibilidad de declarar múltiples funciones con el mismo nombre pero con diferentes parámetros. Esto permite crear una API legible y conveniente.
Problema
Cuando hay muchas funciones con el mismo nombre, el compilador necesita elegir la implementación adecuada entre todas las sobrecargadas, considerando los tipos de argumentos, conversiones, parámetros por defecto y referencias. Con una sobrecarga descuidada, surgen ambigüedades y errores difíciles de detectar.
Solución
El compilador elige la función en función de la mejor coincidencia de la secuencia de argumentos, la precisión del tipo de coincidencia y las mínimas conversiones. Pero hay que tener en cuenta matices: si hay conversiones significativas o argumentos por defecto, se puede obtener inesperadamente ambigüedad.
Ejemplo de código:
void foo(int x); void foo(double x); void foo(int x, int y = 0); foo(5); // llamará a void foo(int x), porque es una coincidencia exacta foo(5.2); // llamará a void foo(double x) foo(5, 6); // llamará a void foo(int x, int y)
Características clave:
¿Se puede sobrecargar funciones solo por el tipo de retorno?
No. La sobrecarga es posible SOLAMENTE por el tipo y número de parámetros, el tipo de retorno no participa en la resolución de sobrecarga.
int foo(); double foo(); // Error: la sobrecarga solo por el tipo de retorno no es posible!
¿Cómo elige el compilador qué función sobrecargada llamar si todos los parámetros son convertibles?
El compilador elige la "mejor coincidencia" — la función que requiere el menor número de conversiones de tipos, o una coincidencia exacta. Si existe ambigüedad, el código no se compilará.
void bar(int); void bar(long); bar(1); // int coincidencia exacta: se llamará a bar(int)
¿Se puede mezclar sobrecarga con argumentos por defecto y sobrecarga normal?
Se puede, pero se puede obtener ambigüedad en la llamada si las firmas de las funciones se superponen.
void test(int x); void test(int x, int y = 10); test(5); // Error: ambigüedad — ambas son adecuadas
En la biblioteca, hay funciones sobrecargadas con parámetros por defecto superpuestos, lo que lleva a errores de compilación al actualizar el código.
Pros:
Contras:
En el proyecto se establece un acuerdo: no mezclar sobrecargas con argumentos por defecto, o usar solo una función con valores por defecto o simplemente sobrecargar con parámetros únicos.
Pros:
Contras: