Declaración de clase en el mismo alcance que el uso de compilaciones de declaración en GCC pero no en MSVS

¿El siguiente programa está bien formado de acuerdo con el estándar c ++?

namespace X { class A; }

namespace Y { using X::A; class A {}; }

int main() {}

Estoy obteniendo diferentes resultados con diferentes compiladores:

gcc lo compila sin errores.visual c ++ da el error C2888: 'X :: A': el símbolo no se puede definir dentro del espacio de nombres 'Y'

No encuentro ninguna regla en el estándar de c ++ que viole mi programa.

Si el programa está bien formado, ¿por qué Visual Studio da un error?

Si el programa no está bien formado, ¿qué regla en el estándar de c ++ violó y por qué gcc no da un error?

No estoy tratando de compilar mi programa. Solo estoy tratando de averiguar si está bien formado de acuerdo con el estándar c ++ y por qué los dos compiladores que probé se comportan de manera diferente.

Respuestas a la pregunta(2)

Su respuesta a la pregunta