Почему я не могу сделать вектор ссылок?

Когда я делаю это:

std::vector<int> hello;

Все работает отлично. Однако, когда я делаю это вектором ссылок вместо этого:

std::vector<int &> hello;

Я получаю ужасные ошибки как

ошибка C2528: 'указатель': указатель на ссылку недопустим

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

328
задан Jonas 18 November 2019 в 10:15
поделиться

5 ответов

Тип компонента контейнеров, таких как векторы, должен быть назначаемым . Ссылки не назначаются (вы можете инициализировать их только один раз, когда они объявлены, и вы не можете заставить их ссылаться на что-то еще позже). Другие неназначаемые типы также не допускаются в качестве компонентов контейнеров, например vector не допускается.

315
ответ дан 23 November 2019 в 00:48
поделиться

По самой своей природе ссылки могут быть установлены только во время их создания; т.е. следующие две строки имеют очень разные эффекты:

int & A = B;   // makes A an alias for B
A = C;         // assigns value of C to B.

Кроме того, это недопустимо:

int & D;       // must be set to a int variable.

Однако, когда вы создаете вектор, нет способа присвоить значения его элементам при создании. По сути, вы просто делаете целую группу из последнего примера.

30
ответ дан 23 November 2019 в 00:48
поделиться

Это недостаток языка C ++. Вы не можете взять адрес ссылки, поскольку попытка сделать это приведет к получению адреса объекта, на который делается ссылка, и, следовательно, вы никогда не сможете получить указатель на ссылку. std :: vector работает с указателями на свои элементы, поэтому на сохраняемые значения должна быть возможность указывать. Вместо этого вам придется использовать указатели.

12
ответ дан 23 November 2019 в 00:48
поделиться

boost :: ptr_vector будет работать.

Edit: было предложением использовать std :: vector > , который не будет работать, потому что вы не можете создать по умолчанию boost :: ref .

14
ответ дан 23 November 2019 в 00:48
поделиться

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

Однако вы можете рассмотреть возможность использования вместо этого ptr_vector !

]
3
ответ дан 23 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: