2015-04-02 1 views
2

Ce code ne peut pas compiler dans Visual Studio 2013:std :: unordered_map avec des références en tant que valeurs ne fonctionne pas?

#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; 
} 

Avec ces messages d'erreur:

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 

Quand je change à des pointeurs, il compile bien. Les références sont-elles invalides en tant que types de valeur dans std :: unordered_map?

Le même code fonctionne très bien avec boost :: unordered_map.

+0

En guise de supposition, est-ce parce que vous utilisez emplace, qui utilise directement la valeur donnée dans le constructeur, mais votre classe n'a pas de constructeur de copie? –

+1

@Ben comment copier une référence? – sehe

+0

@sehe, ahhhh, ça ne fait rien. Je devrais lire plus attentivement. –

Répondre

3

Les références ne sont pas copiables ni affectables. Ils ne sont pas pris en charge en tant que types de valeur dans un conteneur de bibliothèque standard.

Vous pouvez stocker std::reference_wrapper<MyClass> ou presque MyClass* quoique équivalente

0

valeurs conteneurs doivent être copiable ou mobile si vous faites quoi que ce soit avec le conteneur. Clairement, ce n'est pas possible avec des références. Par conséquent, votre programme est illégal.