Ответ 1
Контейнеры хранят объекты. Ссылки не являются объектами.
В спецификации С++ 11 четко указано (§23.2.1 [container.requirements.general]/1):
Контейнеры - это объекты, которые хранят другие объекты.
В моей программе у меня есть набор STL.
set<string> myStrings;
Чтобы повысить эффективность моего кода, я изменил его на наличие, только указатели. (Мне не нужны фактические строковые копии для хранения.)
set<string*> myStrings;
Я читал, что хорошей практикой является замена указателей ссылками, когда это возможно. (Конечно, только если фактическая функциональность указателя не нужна.)
set<string&> myStrings;
Последний из них дает мне много ошибок компилятора. Почему невозможно использовать ссылки в качестве элементов контейнера?
Контейнеры хранят объекты. Ссылки не являются объектами.
В спецификации С++ 11 четко указано (§23.2.1 [container.requirements.general]/1):
Контейнеры - это объекты, которые хранят другие объекты.
Не имеет прямого отношения к "почему", но чтобы дать ответ на предполагаемое желание сделать это, я бы сказал, что стандартная библиотека С++ 11 имеет тип ссылочной оболочки, чтобы включить это. Он неявно конвертируется в ссылку и сохраняется в стандартных контейнерах.
Поскольку контейнеры хранят объекты, а ссылки не являются объектами. Если вы находитесь на С++ 11, вы можете использовать std:: reference_wrapper для переноса объектов в назначаемые объекты.
http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
std:: reference_wrapper - это шаблон класса, который обертывает ссылку в подлежащем копированию присваиваемом объекте. Он часто используется как механизм для хранения ссылок внутри стандартных контейнеров (например, std::vector), которые обычно не могут содержать ссылки.