Должен ли пустой базовый класс влиять на макет производного класса?

Стандарт 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 принимает стандарт, чтобы означать, что если один подобъект имеет нулевой размер, вы можете делать все, что захотите.

Это неопределенное поведение?

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

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