2015-04-02 3 views
2

Этот код не компилировать в Visual Studio 2013:std :: unordered_map со ссылками как значения не работает?

#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.

+0

Как вы думаете, это потому, что вы используете emplace, который напрямую использует заданное значение в конструкторе, но ваш класс не имеет конструктора копирования? –

+1

@Ben как _you_ копировать ссылку? – sehe

+0

@sehe, ahhhh, неважно. Я должен прочитать более внимательно. –

ответ

3

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

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

0

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