2013-04-17 99 views
1

請參閱下面的代碼。我有使用const模板類型。第一行編譯,另外兩行不行。爲什麼這兩個不編譯?而編譯的第一個 - 可以編寫它嗎? std::map<const int, const bool>std::map<int, bool>有何區別?std ::具有const模板和const參考模板參數的地圖

std::map<const int, const bool> mm; 
std::map<const int&, const bool> mm; 
std::map<const int, const bool&> mm; 

我知道,這是一個奇怪的問題,但請幫忙澄清。

+0

我可以理解它的價值,但對於關鍵 - 不!看你寫'myMap [key] = value;'因此這個值不能是引用類型。關鍵是什麼? – Narek

+0

您不能在std :: maps中使用引用,請參閱http://stackoverflow.com/questions/4239253/c-is-it-possible-to-use-a-reference-as-the-value-in-a-地圖 – Akobold

+0

爲什麼?如果不是?爲什麼我得到編譯錯誤? – Narek

回答

2

爲什麼const值? map::value_type確實是std::pair<const Key, Value>。 您不能在any收藏夾中存儲參考。

標準要求之一。

T& operator[](const key_type& x); 

要求:key_typeCopyInsertable和mapped_type應DefaultInsertable到 *這一點。

但是,const reference不是CopyInsertable

+0

爲什麼,例如在std :: vector中只需要複製ctor no?關聯容器需要copy ctor和operator <()。 – Narek

+0

@Narek:因爲一個向量只需要複製(或移動)元素;而(有序)關聯容器也需要比較它們以確定順序。 –

+1

您選擇了具有最嚴格要求的'operator []'。你可以在不使用'operator []'的情況下使用map,並且需要'DefaultInsertable'將會消失... –

相關問題