Multimap插入键typeinfo与std :: make_pair vs std :: pair构造函数

时间:2016-06-10 10:06:52

标签: c++ c++11 std-pair typeid

我想了解为什么以下代码使用std :: pair构造函数有效:

代码:

 std::multimap< std::type_index, void * > mm;
 mm.insert(std::pair<std::type_index, void *>(typeid(int), 0));

使用std :: make_pair:

时会出现编译错误

错误:

C2248 'type_info::type_info' cannot access private member declared in class 'type_info' 

代码:

 std::multimap< std::type_index, void * > mm;
 mm.insert(std::make_pair(typeid(int), 0));

任何线索?谢谢 !

1 个答案:

答案 0 :(得分:4)

typeid的返回类型是std::type_info对象,没有定义构造函数。当make_pair从传入的参数中推导出其输出对的模板参数时,它会推导出std::pair<std::type_info, int>。然后,由于上述原因,它无法创建所需的对。

您的其他行使用显式模板参数创建配对:std::pair<std::type_index, void *>。这一次,您正在创建一个std::type_index对象,其中 具有构造函数,该构造函数需要std::type_info - 正是您提供的对象。所以没问题。

如果同时给出明确的模板参数,您的make_pair行也会编译:

mm.insert(std::make_pair<std::type_index, void *>(typeid(int), 0));