为什么无效的C ++映射声明在编译时不会失败?

时间:2017-04-11 02:47:20

标签: c++ stl compilation

请考虑以下事项:

#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提供小于运算符的约束?

1 个答案:

答案 0 :(得分:5)

正如您所编写的那样,地图具有std::less<Key>类型的比较功能。在您尝试使用该比较函数的操作之前,代码就可以了。

默认构造函数创建一个没有条目的映射,因此不进行比较。当你插入时,它需要进行比较,所以它会尝试 - 并且你得到一个编译错误。