¿En qué forma const está interfiriendo con la marca de una plantilla más especializada al usar punteros?
Tengo este código funcionando:
template <typename x,="" typename="" y="">
auto f(X a, Y b) { return a + b; };
template <typename x,="" typename="" y="">
auto f(X* a, Y* b) { return *a + *b; };
int main() {
int* p;
int* q;
f(p, q);
}
que se compila y se ejecuta la segunda función f()
, porque es más especializada.
Sin embargo, si calificamos los argumentos como const
de esta manera:
template <typename x,="" typename="" y="">
auto f(const X a, const Y b) { return a + b; };
template <typename x,="" typename="" y="">
auto f(const X* a, const Y* b) { return *a + *b; };
int main() {
int* p;
int* q;
f(p, q);
}
Ya no funciona y trata de seleccionar la primera función, fallando en la suma a + b
para punteros.
¿Por qué la calificación de const
en los tipos hace que el segundo template ya no sea más especializado?
davy.ai
Agregar calificadores
const
a los tipos de los argumentos de la función afecta la deducción de tipos que ocurre durante la resolución de sobrecarga. Cuando los tipos no sonconst
, el compilador puede deducir los tiposX
yY
de los argumentos de función pasados af
, y luego elegir la plantilla de función más especializada para llamar. Sin embargo, cuando los tipos sonconst
, los tipos de argumentos ya no son coincidencias exactas para los tipos de parámetros en la segunda plantilla de función, porque un argumento calificado conconst
no se puede pasar directamente a un parámetro no calificado conconst
. Por lo tanto, el compilador debe realizar una conversión de calificación para hacer coincidir los tipos de argumentos con los tipos de parámetros de la segunda plantilla de función, y esto hace que la primera plantilla de función sea una mejor coincidencia en términos de resolución de sobrecarga. Como resultado, se elige la primera plantilla, y el programa no se compila cuando intenta agregar dos punteros calificadosconst
.