使用引用作为值的std :: unordered_map不起作用?

3

这段代码在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中可以正常工作。


你猜测是因为你正在使用emplace,它直接在构造函数中使用给定的值,但你的类没有复制构造函数吗? - Fantastic Mr Fox
1
@Ben 你怎么复制一个引用? - sehe
@sehe,啊哈,没事了。我应该更仔细地阅读。 - Fantastic Mr Fox
2个回答

5

引用是不可复制或赋值的。它们在任何标准库容器中都不被支持作为值类型。

您可以存储std::reference_wrapper<MyClass>或几乎等效的MyClass*


0

如果您需要对容器进行任何操作,那么容器的值必须是可复制或可移动的。显然,使用引用是不可能实现这一点的。因此,您的程序是非法的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接