带引用键的unordered_map

时间:2012-11-04 20:16:45

标签: c++ c++11 const unordered-map

我对新的C ++ unordered_map有问题:我想将operator[]const密钥一起使用,但我被拒绝了。

我无法提供整个代码,但我可以像这样简化我的问题:

#include <unordered_map>

class A {
    public:
        A();
};

class B {
    public:
        B();
};

int main(int argc, char **argv) {
    std::unordered_map<A &, B> myMap;
    A a;
    const A &ar = a;
    B b;
    myMap[ar] = b;
}

编译器的输出有点长,但以:

结束
/usr/include/c++/4.6/bits/hashtable_policy.h:537:5: note:   no known conversion for argument 1 from ‘const A’ to ‘A&’

我使用const A &,因为在我的代码中,某些方法按原样提供给我。顺便说一句,密钥应该是const。我尝试了std::unordered_map<const A &, B> myMap;,但它也不起作用。

我使用gcc版本4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5),-std=c++0x标志。

你可以告诉我为什么禁止这样做?我必须说我不明白原因。

非常感谢(如果问题很愚蠢,请原谅......)。

2 个答案:

答案 0 :(得分:4)

原因是operator[]指定如下(注意同样适用于std::map):

Value& operator[](Key const& k);

在您的情况下,KeyA&,因此扩展为:

B& operator[](A& const& k);

由于引用引用无效,并且在通过typedef或模板参数创建时删除了顶级引用,因此您只需:

B& operator[](A&);

无法处理A const&参数。

一般来说,我建议不要使用可变引用作为密钥,因为可变密钥是错误的良好来源。

答案 1 :(得分:0)

使用引用作为键是一个坏主意:它必然会导致问题,因为地图的生命周期和键未对齐。您的引用地图的关键类型是T&(嗯,最后添加了const但它是非法的)。尝试将T const&绑定到T&不起作用。因此,您无法使用T const&使用T&作为关键字在地图中查找。

还有其他一些不起作用的东西。您不应该尝试使用密钥为T&(或T*的地图):使用值作为键!