tecnologia teclado tabla simbolos simbolo significado informatica definicion c++ name-resolution

c++ - teclado - Declaración de método cambia el significado del símbolo



simbolos informatica definicion (1)

Para el siguiente código:

struct foo {}; struct A { typedef foo foo_type; void foo(); };

GCC da un error de compilación:

test.cpp:7:14: error: declaration of ''void A::foo()'' [-fpermissive] void foo(); ^ test.cpp:1:8: error: changes meaning of ''foo'' from ''struct foo'' [-fpermissive] struct foo {}; ^

Pero Clang lo acepta sin errores de compilación. Quien tiene razon

Tenga en cuenta que si se quita el typedef, o si se cambia a typedef ::foo foo_type , tanto gcc como clang aceptan el código.


gcc es correcto, pero no se requiere un clang para dar un diagnóstico (3.3.7):

Un nombre N utilizado en una clase S se referirá a la misma declaración en su contexto y cuando se vuelva a evaluar en el alcance completo de S. No se requiere un diagnóstico para violar esta regla.

Esto se debe a cómo funciona el alcance de la clase. El foo de void foo(); es visible dentro del alcance completo de la clase A , por lo que la declaración de void foo(); cambia el significado de foo en el typedef de referirse a struct foo al nombre de la función foo .