Buscar..


Observaciones

  • Una función normal nunca está relacionada con una plantilla de función, a pesar del mismo nombre, del mismo tipo.
  • Una llamada de función normal y una llamada de plantilla de función generada son diferentes incluso si comparten el mismo nombre, el mismo tipo de retorno y la misma lista de argumentos

¿Qué es una sobrecarga de plantilla de función válida?

Una plantilla de función se puede sobrecargar bajo las reglas para la sobrecarga de funciones que no son de plantilla (mismo nombre, pero diferentes tipos de parámetros) y además, la sobrecarga es válida si

  • El tipo de retorno es diferente, o
  • La lista de parámetros de la plantilla es diferente, excepto por la denominación de los parámetros y la presencia de argumentos predeterminados (no forman parte de la firma)

Para una función normal, la comparación de dos tipos de parámetros es fácil para el compilador, ya que tiene toda la información. Pero un tipo dentro de una plantilla puede no estar determinado todavía. Por lo tanto, la regla para cuando dos tipos de parámetros son iguales es aproximativa aquí y dice que los tipos y valores no dependientes deben coincidir y que la ortografía de los tipos y expresiones dependientes debe ser la misma (más precisamente, deben ajustarse a la denominadas reglas de ODR), excepto que los parámetros de la plantilla pueden ser renombrados. Sin embargo, si bajo tales ortografías diferentes, dos valores dentro de los tipos se consideran diferentes, pero siempre se crea una instancia de los mismos valores, la sobrecarga no es válida, pero no se requiere ningún diagnóstico del compilador.

template<typename T>
void f(T*) { }

template<typename T>
void f(T) { }

Esta es una sobrecarga válida, ya que "T" y "T *" son ortografías diferentes. Pero lo siguiente no es válido, sin diagnóstico requerido

template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }

template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow