Una regla de definición y diferentes definiciones de clase en dos unidades de traducción

Hay este código:

archivo a.hpp:

class A;

archivo a.cpp:

#include "a.hpp"

struct A {
   int x = 777;
   int y;
};

A a_zew;

archivo main.cpp:

#include "a.hpp"
#include <iostream>

class A { // definition of class A is different than above
public:
   int x;
};

int main() {
   A a; // definition of class A in main.cpp
   extern A a_zew; // definition of class A in a.cpp
   std::cout << a_zew.x << std::endl; // 777
   std::cout << a.x << std::endl; // junk
   return 0;
}

Asi que claseA Se define tanto en el archivo.main.cpp ya.cpp y también hay dos objetos de estas clases definidos en cada unidad de traducción. Definición en ambas unidades de traducción de clase.A Es diferente pero este código compila. Sin embargo, una regla de definición dice que puede haber muchas definiciones del tipo en el programa (pero solo una en cada unidad de traducción) y estas definiciones deberían ser las mismas. Entonces, ¿por qué este código se compila incluso si la definición de claseA Es diferente en ambos archivos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta