2017-04-11 86 views
0

考慮以下幾點:爲什麼無效的C++映射聲明在編譯時不會失敗?

#include <map> 
#include <string> 

struct Key {}; 

int main(int argc, const char** argv) { 
    std::map<Key, std::string> key_map; 
    key_map.insert(std::make_pair(Key(), "hello")); 

    return 0; 
} 

顯然,這將無法編譯,因爲Key不提供比運營商少。但是,如果我註釋掉第二行main()(僅留下map聲明),它會進行編譯。

問題:這是爲什麼?模板std::map<K, V>是否強制執行K在聲明時提供小於運算符的約束?

回答

5

如您所寫,該地圖具有std::less<Key>類型的比較功能。在您嘗試使用該比較函數的操作之前,代碼沒有問題。

默認的構造函數創建一個沒有條目的地圖,所以它不作比較。當你插入時,它需要做比較,所以它會嘗試 - 並且你會得到一個編譯錯誤。

+3

換句話說,聲明映射並不會嘗試實例化相應的insert()方法。沒有理由實例化未使用的方法。類和它的默認構造函數實例化得很好,但是'insert()'不。 – cdhowie

+0

沒錯,@cdhowie –

相關問題