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
がより小さい演算子を提供するという制約を適用してはいけませんか?
別の言い方をすれば、マップを宣言しても、対応する 'insert()'メソッドをインスタンス化しようとはしません。使用されていないメソッドをインスタンス化する理由はありません。クラスとそのデフォルトのコンストラクタはうまくインスタンス化しますが、 'insert()'はインスタンス化しません。 – cdhowie
まさに、@cdhowie –