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.

¿Se puede eliminar una función que devuelve un tipo incompleto en C++?

En el siguiente ejemplo, la función f() que devuelve el tipo incompleto A está marcada como eliminada:


struct A;
A f() = delete;

Es aceptado por GCC, pero no por Clang, el cual arroja el siguiente error:


error: tipo de resultado incompleto 'A' en la definición de la función

Demo: https://gcc.godbolt.org/z/937PEz1h3

¿Cuál compilador está correctamente de acuerdo con el estándar?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Según el estándar de C++, ambos compiladores están correctamente en su comportamiento. El estándar especifica que una función puede ser eliminada incluso si su tipo de retorno es incompleto. Sin embargo, también establece que el tipo de retorno debe ser completo en el momento de la definición de la función. Por lo tanto, el comportamiento de los compiladores puede diferir dependiendo de cuándo realizan la comprobación de tipos.

    En este ejemplo específico, GCC acepta el código porque realiza la comprobación de tipos después de encontrarse con la declaración de la función, lo cual no requiere que se especifique un tipo completo. Por otro lado, Clang realiza la comprobación de tipos en el punto de la definición de la función, donde se requiere que el tipo de retorno sea completo, lo que resulta en un error de compilación.

Comments are closed.