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.

Plantillas de funciones miembro estáticas y no estáticas con los mismos tipos de parámetros y cláusula “requires” en C++.

Las funciones miembro estáticas y no estáticas con los mismos tipos de parámetros no pueden ser sobrecargadas. Sin embargo, si las funciones miembro son plantillas y una de ellas tiene una cláusula requires, todos los compiladores lo permiten. Pero los problemas aparecen cuando se llaman ambas funciones miembro:

struct A {
    static int f(auto) { return 1; }
    int f(auto) requires true { return 2; }
};

<p>int main() {
    [[maybe<em>unused]] int (A::*y)(int) = &A::f; // ok en todos los lugares (si no hay línea de abajo)
    [[maybe</em>unused]] int (*x)(int) = &A::f; // ok en GCC y Clang (si no hay línea de arriba)
}

Si solo se deja una (cualquiera) línea en main(), entonces GCC y Clang aceptan el programa. Pero cuando ambas líneas en main() están presentes, Clang imprime el siguiente error:

error: definition with same mangled name 'ZN1A1fIiEEiT' as another definition

y GCC informa de un error interno del compilador. Demostración: https://gcc.godbolt.org/z/4c1z7fWvx

¿Están todos los compiladores equivocados al aceptar la definición de struct A con funciones miembro estáticas y no estáticas sobrecargadas? ¿O simplemente tienen errores similares en la llamada de ambas funciones?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El comportamiento de los compiladores en esta situación está permitido por el estándar del lenguaje C++. Según el estándar, las funciones miembro estáticas y no estáticas con los mismos tipos de parámetros no pueden ser sobrecargadas, pero esta restricción no se aplica a las funciones miembro que son plantillas y tienen una cláusula requires.

    Por lo tanto, la definición de struct A con las dos funciones miembro es válida. El problema surge cuando ambas funciones miembro se llaman en el mismo programa, como se muestra en el fragmento de código proporcionado. Los errores e errores internos del compilador informados sugieren que los compiladores pueden tener errores al manejar la llamada de ambas funciones.

    En conclusión, los compiladores no están equivocados al aceptar la definición de struct A, pero pueden tener errores al manejar la llamada de las funciones miembro sobrecargadas.

Comments are closed.