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

Rya*_*yan 0 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;
}
Run Code Online (Sandbox Code Playgroud)

显然,这不会编译,因为Key不提供小于运算符.但是,如果我注释掉第二行main()(只留下map声明),它就会编译.

问题:这是为什么?在声明时,模板是否应该std::map<K, V>强制执行K提供小于运算符的约束?

Mar*_*low 5

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

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

  • 换句话说,声明一个map并不会尝试实例化相应的`insert()`方法.没有理由实例化未使用的方法.该类及其默认构造函数实例化得很好,但``insert()`却没有. (3认同)