C++ 为什么无效的C++;映射声明在编译时没有失败吗?
考虑以下几点:C++ 为什么无效的C++;映射声明在编译时没有失败吗?,c++,stl,compilation,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; } #包括 #包括 结构键{}; int main(
#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;
}
#包括
#包括
结构键{};
int main(int argc,常量字符**argv){
std::map key\u map;
key_map.insert(std::make_pair(key(),“hello”);
返回0;
}
显然,这不会编译,因为键
不提供小于运算符。但是,如果我注释掉main()
的第二行(只留下map
声明),它将编译
问题:这是为什么?模板
std::map
是否应该强制执行K
在声明时提供小于运算符的约束?正如您所写的,映射具有类型为std::less
的比较函数。在执行尝试使用该比较函数的操作之前,代码是正常的
默认构造函数创建一个没有条目的映射,因此不进行比较。当您插入时,它需要进行比较,因此它会尝试-您会得到一个编译错误。正如您所写的,映射具有类型为
std::less
的比较函数。在执行尝试使用该比较函数的操作之前,代码是正常的
默认构造函数创建一个没有条目的映射,因此不进行比较。当您插入时,它需要进行比较,因此它会尝试-您会得到一个编译错误。换句话说,声明映射不会尝试实例化相应的
insert()
方法。没有理由实例化未使用的方法。类及其默认构造函数实例化得很好,但是insert()
没有实例化。确切地说,@cdhowiet换句话说,声明映射不会尝试实例化相应的insert()
方法。没有理由实例化未使用的方法。该类及其默认构造函数实例化得很好,但是insert()
没有实例化