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。

4

2 回答 2

5

引用不可复制也不可分配。它们不支持作为任何标准库容器中的值类型。

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

于 2015-04-02T22:28:15.500 回答
0

如果您对容器执行很多操作,容器值必须是可复制或可移动的。显然,这是不可能的参考。因此,您的程序是非法的。

于 2015-04-02T22:28:20.363 回答