Почему хранение ссылок (не указателей) в контейнерах в C ++ не работает? - PullRequest
24 голосов
/ 25 октября 2010

В моей программе установлен STL.

set<string> myStrings;

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

set<string*> myStrings;

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

set<string&> myStrings;

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

Ответы [ 3 ]

45 голосов
/ 25 октября 2010

Магазин контейнеров Объекты .Ссылки не являются объектами.

В спецификации C ++ 11 четко говорится (§23.2.1 [container.requirements.general] / 1):

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

12 голосов
/ 15 октября 2013

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

2 голосов
/ 15 января 2016

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

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

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

...