Uma regra de definição e diferentes definições de classe em duas unidades de tradução

Existe este código:

arquivo a.hpp:

class A;

arquivo a.cpp:

#include "a.hpp"

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

A a_zew;

arquivo 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;
}

Então classeA é definido em arquivomain.cpp ea.cpp e há também dois objetos dessas classes definidos em cada unidade de tradução. Definição em ambas as unidades de tradução da classeA é diferente, mas esse código é compilado. No entanto, uma regra de definição diz que pode haver muitas definições do tipo no programa (mas apenas uma única em cada unidade de tradução) e essas definições devem ser as mesmas. Então, por que esse código compila mesmo se a definição de classeA é diferente em ambos os arquivos?

questionAnswers(1)

yourAnswerToTheQuestion