[英]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);
在您的情況下, Key
是A&
,因此擴展為:
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.