std :: unordered_map со ссылками в качестве значений не работает?

Этот код не компилируется в Visual Studio 2013:

#include <iostream>
#include <unordered_map>

class MyClass
{
public:
char a;
};

int main()
{
std::unordered_map<int, MyClass&> MyMap;
MyClass obj;
obj.a = 'a';
MyMap.emplace(1, obj);
std::cout << MyMap[1].a;
}

С этими сообщениями об ошибках:

Error   1   error C2440: 'initializing' : cannot convert from 'int' to 'MyClass &'  c:\program files (x86)\microsoft visual studio 12.0\vc\include\tuple    746

Error   2   error C2439: 'std::pair<const _Kty,_Ty>::second' : member could not be initialized  c:\program files (x86)\microsoft visual studio 12.0\vc\include\tuple    746

Когда я изменяю его на указатели, он компилируется нормально. Являются ли ссылки недействительными как типы значений в std :: unordered_map?

Тот же код отлично работает с boost :: unordered_map.

3

Решение

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

Вы можете хранить std::reference_wrapper<MyClass> или, почти эквивалентно MyClass* хоть

4

Другие решения

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

0

По вопросам рекламы [email protected]