es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for 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 son const, el compilador puede deducir los tipos X y Y de los argumentos de función pasados a f, y luego elegir la plantilla de función más especializada para llamar. Sin embargo, cuando los tipos son const, 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 con const no se puede pasar directamente a un parámetro no calificado con const. 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 calificados const.

Comments are closed.