Вы должны рассматривать ссылку как «постоянный указатель на неконстантный объект»:
MyObject& ~~ MyObject * const
Кроме того, ссылка может быть построена только как псевдоним чего-то существующего (что не является необходимым для указателя, хотя и желательно, кроме NULL). Это не гарантирует, что объект останется вокруг (и, действительно, у вас может быть ядро при доступе к объекту через ссылку, если его больше нет), рассмотрите этот код:
// Falsifying a reference
MyObject& firstProblem = *((MyObject*)0);
firstProblem.do(); // undefined behavior
// Referencing something that exists no more
MyObject* anObject = new MyObject;
MyObject& secondProblem = *anObject;
delete anObject;
secondProblem.do(); // undefined behavior
Теперь существует два требования к контейнеру STL:
- T должен быть конструируемым по умолчанию (ссылка не является)
- T должен быть назначен (вы не можете сбросить ссылку, хотя вы можете назначить ее рефери)
Итак, в контейнерах STL вы должны использовать прокси или указатели.
Теперь использование указателей может оказаться проблематичным для обработки памяти, поэтому вам может потребоваться:
НЕ использовать auto_ptr , существует проблема с присваиванием, поскольку оно изменяет правый операнд.
Надеюсь, это поможет:)