Одно правило определения и разные определения классов в двух единицах перевода

Вот этот код:

файл a.hpp:

class A;

файл a.cpp:

#include "a.hpp"

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

A a_zew;

файл 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;
}

Итак, классA определяется как в файлеmain.cpp а такжеa.cpp и есть также два объекта этих классов, определенных в каждой единице перевода. Определение в обеих единицах перевода классаA отличается, но этот код компилируется. Однако одно правило определения говорит, что в программе может быть много определений типа (но только одно в каждой единице перевода), и эти определения должны быть одинаковыми. Так почему этот код компилируется, даже если определение классаA отличается в обоих файлах?

Ответы на вопрос(1)

Ваш ответ на вопрос