【问题标题】:unordered_map with referenced key带有引用键的 unordered_map
【发布时间】:2012-11-04 20:16:44
【问题描述】:

我对新的 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 &amp;,因为在我的代码中,某些方法按原样将其提供给我。而且,顺便说一句,键应该是 const。我已经尝试了std::unordered_map&lt;const A &amp;, B&gt; myMap;,但它也不起作用。

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

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

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

【问题讨论】:

  • “我不能给出完整的代码,但我可以像这样简化我的问题” +1,因为这正是我们希望你在提问时所做的,试试将其减少到问题仍然存在的最小可能示例。
  • 再次感谢整个社区。我很快就得到了许多准确而有用的答案。太棒了!

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


【解决方案1】:

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

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

在你的例子中,Key 是 A&amp;,所以这扩展为:

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

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

B& operator[](A&);

无法处理 A const&amp; 参数。

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

【讨论】:

  • 是这样吗?非常感谢您的回答。我不知道这个。这些技术细节对我来说仍然是个谜。
【解决方案2】:

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

还有其他一些不起作用的东西。您不应该尝试使用键为T&amp;(或T*)的映射:使用值作为键!

【讨论】:

  • 不是地图是 const,但关键是。
  • @Xeo:对。您也不能将T const&amp; 绑定到T&amp;,这是尝试在此处使用的键类型(即使假设映射中的所有其他内容都可以使用它不使用的引用)。
  • 非常感谢。我现在明白为什么这张地图实际上是一个概念缺陷。我马上改。
猜你喜欢
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多