簡體   English   中英

帶引用鍵的unordered_map

[英]unordered_map with referenced key

我對新的C ++ unordered_map有問題:我想使用帶有const鍵的operator[] ,但是我被拒絕了。

我無法提供整個代碼,但我可以像這樣簡化我的問題:

#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標志。

你能告訴我為什么這是禁止的嗎? 我必須說我不理解原因。

非常感謝(如果問題很愚蠢,請原諒我......)。

原因是operator[]被指定如下(請注意,僅適用於std::map ):

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

在您的情況下, KeyA& ,因此擴展為:

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

並且由於引用引用無效並且在通過typedef或模板參數創建時刪除了頂級引用,因此您只需:

B& operator[](A&);

哪個無法處理A const& argument。

一般來說,我建議不要使用可變引用作為密鑰,因為可變密鑰是錯誤的良好來源。

使用引用作為鍵是一個壞主意:它必然會導致問題,因為地圖的生命周期和鍵不對齊。 引用映射的關鍵類型是T& (嗯,最后添加了一個const ,但它是非法的)。 試圖綁定T const& T&不起作用。 因此,您不能使用T const&使用T&作為鍵在地圖中查找。

還有其他的東西是行不通的。 您不應該嘗試使用帶有T& (或T*鍵)的映射:使用值作為鍵!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM