Расширение моего предыдущего комментария:
Объект идентифицируется по его адресу. Если вы сравниваете адреса (например, указатели) двух объектов одного типа и они сравниваются одинаково, считается, что указатели указывают на один и тот же объект.
Объекты разных типов нельзя сравнивать напрямую таким образом, поэтому им разрешено иметь один и тот же адрес. Одним из примеров является структура и ее первый член. Они не могут быть одного типа. Также не может базовый класс и производный класс, поэтому они могут иметь один и тот же адрес, если базовый класс пуст.
Однако базовый класс и первый член производного класса могут быть одного типа. Это не проблема, если базовый класс также не пуст и компилятор не пытается выполнить пустую оптимизацию базового класса. В этом случае у нас могут быть одинаковые указатели на два разных объекта одного типа, и поэтому мы считаем, что это один и тот же объект.
Итак, если члены имеют разные типы (пустые и char), они могут иметь один и тот же адрес. Если они относятся к одному и тому же типу, они не могут этого сделать, потому что это нарушит тесты на идентичность объекта, такие как if (this != &that)
, иногда используемые для проверки таких вещей, как самоопределение.
Кстати, Microsoft согласна, что это ошибка в их компиляторе, но есть другие, более срочные, проблемы, которые нужно исправить в первую очередь.