Наличие двух объектов по одному и тому же адресу будет означать, что не будет никакого способа отличить эти два объекта при обращении к ним с помощью указателей.Например, в следующем коде:
EmptyClass o1;
EmptyClass o2;
EmptyClass * po = &o;
po->foo();
Должен ли метод foo вызываться для o1
или o2
?
Можно утверждать, что, поскольку эти объекты не имеют данных иникаких виртуальных методов (иначе они будут иметь ненулевой размер), не имеет значения, в каком экземпляре вызывается метод.Однако это становится более важным, когда мы хотим проверить, равны ли два объекта (т. Е. Если они одинаковы):
template < typename T >
bool isSame( T const & t1, T const & t2 )
{
return &t1 == &t2;
}
EmptyClass o1; // one object and...
EmptyClass o2; // ...a distinct object...
assert( ! isSame( o1, o2 ) ); // ...should not be one and same object!
Для более конкретного примера давайте предположим, что я хочу связать некоторые объекты (Я мог бы сказать сущности) с некоторыми значениями, скажем, в ассоциативном контейнере:
Person you;
Person me;
// You and I are two different persons
// (unless I have some dissociative identity disorder!)
// Person is a class with entity semantics (there is only one 'me', I can't make
// a copy of myself like I would do with integers or strings)
std::map< Person *, std::string > personToName;
personToName[&you] = "Andrew_Lvov";
personToName[&me] = "Luc Touraille";
// Oh, bother! The program confused us to be the same person, so now you and I
// have the same name!
Так что да, все сводится к идентичности объекта: если бы объектам было позволено быть пустыми, их можно было бы лишитьидентичность, которая просто не допускается языком (к счастью).