2017-04-11 6 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()の2行目をコメントアウトすると(map宣言だけが残っています)、コンパイルされます。

質問:これはなぜですか?テンプレートstd::map<K, V>は、宣言時にKがより小さい演算子を提供するという制約を適用してはいけませんか?

答えて

5

マップは、書いたように、タイプがstd::less<Key>の比較関数を持っています。その比較関数を使用しようとする操作を行うまで、コードは正常です。

デフォルトのコンストラクタはエントリのないマップを作成するため、比較は行われません。挿入すると比較が必要なので、コンパイルエラーが発生します。

+3

別の言い方をすれば、マップを宣言しても、対応する 'insert()'メソッドをインスタンス化しようとはしません。使用されていないメソッドをインスタンス化する理由はありません。クラスとそのデフォルトのコンストラクタはうまくインスタンス化しますが、 'insert()'はインスタンス化しません。 – cdhowie

+0

まさに、@cdhowie –

関連する問題