3

我对新的 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&’

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

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

你能告诉我为什么这是被禁止的吗?我必须说我不明白原因。

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

4

2 回答 2

4

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

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

在你的情况下,Keyis A&,所以这扩展为:

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

并且由于对引用的引用是无效的,并且在通过 typedef 或模板参数创建时会删除顶级引用,因此您将得到:

B& operator[](A&);

哪个不能处理A const&争论。

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

于 2012-11-04T20:24:42.337 回答
0

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

还有其他事情是行不通的。您不应该尝试使用带有T&(或T*就此而言)键的映射:使用值作为键!

于 2012-11-04T20:21:35.947 回答