Подтвердить что ты не робот

Почему сохранение ссылок (не указателей) в контейнерах на С++ не работает?

В моей программе у меня есть набор STL.

set<string> myStrings;

Чтобы повысить эффективность моего кода, я изменил его на наличие, только указатели. (Мне не нужны фактические строковые копии для хранения.)

set<string*> myStrings;

Я читал, что хорошей практикой является замена указателей ссылками, когда это возможно. (Конечно, только если фактическая функциональность указателя не нужна.)

set<string&> myStrings;

Последний из них дает мне много ошибок компилятора. Почему невозможно использовать ссылки в качестве элементов контейнера?

4b9b3361

Ответ 1

Контейнеры хранят объекты. Ссылки не являются объектами.

В спецификации С++ 11 четко указано (§23.2.1 [container.requirements.general]/1):

Контейнеры - это объекты, которые хранят другие объекты.

Ответ 2

Не имеет прямого отношения к "почему", но чтобы дать ответ на предполагаемое желание сделать это, я бы сказал, что стандартная библиотека С++ 11 имеет тип ссылочной оболочки, чтобы включить это. Он неявно конвертируется в ссылку и сохраняется в стандартных контейнерах.

Ответ 3

Поскольку контейнеры хранят объекты, а ссылки не являются объектами. Если вы находитесь на С++ 11, вы можете использовать std:: reference_wrapper для переноса объектов в назначаемые объекты.

http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

std:: reference_wrapper - это шаблон класса, который обертывает ссылку в подлежащем копированию присваиваемом объекте. Он часто используется как механизм для хранения ссылок внутри стандартных контейнеров (например, std::vector), которые обычно не могут содержать ссылки.