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.


person user3771111    schedule 02.04.2015    source источник
comment
Возможно, это потому, что вы используете emplace, который напрямую использует заданное значение в конструкторе, но в вашем классе нет конструктора копирования?   -  person Fantastic Mr Fox    schedule 03.04.2015
comment
@Ben, как вы копируете ссылку?   -  person sehe    schedule 03.04.2015
comment
@sehe, аааа, неважно. Я должен читать внимательнее.   -  person Fantastic Mr Fox    schedule 03.04.2015


Ответы (2)


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

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

person sehe    schedule 02.04.2015

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

person Lightness Races in Orbit    schedule 02.04.2015