Si sobrecarga una función y luego se lo llama con un argumento que se adapta perfectamente a una de las sobrecargasNormas de conversión implícita de argumentos de plantilla
int f(int){return 3;}
int f(bool){return 4;}
... //inside main()
f(1); //Calls f(int)
el compilador simplemente elige este partido (perfecto) antes de intentar cualquier conversiones implícitas . Sin embargo, yo he estado tratando de sobrecargar una plantilla de función que en
template <bool veracity>
int f(){return 1;}
template <int amount>
int f(){return 2;}
... //inside main()
f<1>();
pero el compilador se mantenga complainning sobre la llamada ambigua a la sobrecarga f(), indicando que podría ser f<true>()
o f<1>()
. ¿No debería el compilador simplemente elegir la combinación perfecta, en lugar de tratar de convertir en true?
Tenía la impresión de que la conversión implícita para los argumentos de la plantilla era en realidad más restrictiva que la conversión implícita de los argumentos de la función. ¿Hay alguna forma de evitar este problema?
veo. ¿Sabes si hay una razón específica por la cual las reglas son así? Quiero decir, ¿hay alguna dificultad técnica o algo que haría que los compiladores no puedan aplicar la lógica "coincidencia exacta-primer/segundo-conversión implícita" (usada en argumentos de función) a argumentos de plantilla? – Malabarba
No, no estoy seguro. Supongo que se debe principalmente a que las reglas ya son complejas, y agregar un conjunto de reglas para "clasificar" como lo hace para la sobrecarga las haría aún más. No estoy seguro, pero creo que debido a la interacción con las otras reglas para las plantillas, las reglas de clasificación terminarían al menos un poco diferentes de las de sobrecarga, así que no sería solo una cuestión de decir "las funciones candidatas formarán un conjunto de sobrecarga que se resolverá de acuerdo con §13.3". –
Tiene sentido.Gracias. =) – Malabarba