此代码无法在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。
答案 0 :(得分:5)
参考文献不可复制也不可转让。在任何标准库容器中都不支持它们作为值类型。
您可以存储std::reference_wrapper<MyClass>
或几乎等同于MyClass*
答案 1 :(得分:0)
如果您对容器执行大量操作,则容器值必须是可复制的或可移动的。显然,参考不可能做到这一点。因此,您的程序是非法的。