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

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

Это нестандартное поведение?

5
задан MSN 13 October 2011 в 20:43
поделиться