Карта STL, содержащая ссылки, не компилирует

Следующее:

std::map<int, ClassA &> test;

дает:

error C2101: '&' on constant

В то время как следующее

std::map<ClassA &, int> test;

дает

error C2528: '_First' : pointer to reference is illegal

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

8
задан Oliver Zheng 29 May 2010 в 06:04
поделиться

3 ответа

Хранить ссылки в контейнере stl незаконно, поскольку типы должны быть копируемыми и присваиваемыми. Ссылки не могут быть присвоены.

То, какая именно операция вызывает первую ошибку, зависит от реализации, но я предполагаю, что она связана с созданием ссылки и ее немедленным присвоением. Второе сообщение об ошибке похоже на то, что оно связано с построением индекса карты.

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

Этот вопрос SO может быть вам интересен.

16
ответ дан 5 December 2019 в 08:22
поделиться

Вы не можете хранить ссылки, поскольку они не конструируются копированием (и некоторые операции будут невозможны, поскольку они также не конструируются по умолчанию).

Вы можете, однако, эмулировать поведение, используя указатель:

std::map<int, ClassA*> test;

Это немного раздражает, потому что вам нужно дважды разыменовывать:

std::map<int, ClassA*>::iterator it = test.begin();

it->second->foo();

но с map это гораздо менее запутанно, чем с vector или set (это было бы (*it)->foo()).

Наконец, есть некоторые проблемы (связанные с указателями):

  • Вы должны убедиться, что объект, на который указывают указатели, останется живым до тех пор, пока вы хотите использовать указатель
  • По умолчанию указатель инициализируется случайным значением, его использование вызывает неопределенное поведение
  • Когда указатель выбрасывается, объект остается (к счастью), но это значит, что вам нужно сделать так, чтобы в один прекрасный момент он был уничтожен
1
ответ дан 5 December 2019 в 08:22
поделиться

§8.3.2 раздел 5

Не должно быть ссылок на ссылки, массивов ссылок и указателей на ссылки.

Вы, наверное, думаете о ссылках как о забавных указателях. Они не.

3
ответ дан 5 December 2019 в 08:22
поделиться
Другие вопросы по тегам:

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