请考虑以下事项:
#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
提供小于运算符的约束?
答案 0 :(得分:5)
正如您所编写的那样,地图具有std::less<Key>
类型的比较功能。在您尝试使用该比较函数的操作之前,代码就可以了。
默认构造函数创建一个没有条目的映射,因此不进行比较。当你插入时,它需要进行比较,所以它会尝试 - 并且你得到一个编译错误。