Стандарт 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 использует стандарт, означающий, что если один подобъект имеет нулевой размер, вы можете делать все, что захотите.
Это неопределенное поведение?
member
установлен вchar
. - person evnu   schedule 14.10.2011if (this != &that)
. - person Bo Persson   schedule 14.10.2011two subobjects that have the same class type and that belong to the same most derived object must not be allocated at the same address
- person Ise Wisteria   schedule 14.10.2011