Стандарт C++ (цитата из проекта n3242) говорит следующее о подобъектах [intro.object]:
Если объект не является битовым полем или подобъектом базового класса нулевого размера, адрес этого объекта ... размера, адрес этого объекта - это адрес первого байта, который он занимает. Два разных объекта, которые не являются ни битовыми полями, ни подобъектами базового класса с нулевым размером ни базовыми полями, ни подобъектами базового класса нулевого размера, должны иметь разные адреса.
Теперь, учитывая следующий фрагмент:
struct empty { };
struct member: empty { };
struct derived: empty { member m; };
int main(void)
{
printf("%d", sizeof(derived));
return 0;
}
gcc, как я полагаю, печатает 2
, а Visual C++ 2010 печатает 1
. Я подозреваю, что gcc воспринимает стандарт как то, что вы не можете псевдонизировать хранение типов, если они представляют разные объекты. И я готов поспорить, что MSVC принимает стандарт за то, что если один подобъект имеет нулевой размер, вы можете делать все, что хотите.
Это нестандартное поведение?