Когда типы различаются и один или оба типа являются пустым классом, подобъекты должны находиться по одному адресу (если компилятор может отключить пустую оптимизацию базового класса), это точка сжатого пара.
Когда типы совпадают, я думаю, что применяется примечание из главы 10 в стандарте:
Субобъект базового класса может иметь нулевой размер (раздел 9); однако два
подобъекты, имеющие одинаковый тип класса и принадлежащие одному и тому же
самый производный объект не должен размещаться по одному и тому же адресу (5.10).
Похоже, что именно компилятор должен гарантировать, что они размещены по разным адресам (и VC10 может ошибаться).
Комментарии в заголовке буста указывают, что ранее они вообще не удосужились поместить два разных экземпляра одного и того же пустого класса в сжатую пару. Вместо этого они просто сохранили один экземпляр, и оба first()
и second()
вернули один и тот же объект.
// 4 T1 == T2, T1 and T2 both empty
// Originally this did not store an instance of T2 at all
// but that led to problems beause it meant &x.first() == &x.second()
// which is not true for any other kind of pair, so now we store an instance
// of T2 just in case the user is relying on first() and second() returning
// different objects (albeit both empty).