Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么无效的C++;映射声明在编译时没有失败吗?_C++_Stl_Compilation - Fatal编程技术网

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()
没有实例化