c++ - Multimap 使用 std::make_pair 与 std::pair 构造函数插入键类型信息

标签 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));

有什么线索吗?谢谢 !

最佳答案

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));

关于c++ - Multimap 使用 std::make_pair 与 std::pair 构造函数插入键类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37745498/

相关文章:

C++托管到非托管的转换

C++: std::vector - "slice"一个 vector 是可能的吗?

c++ - 在什么情况下会在这种情况下执行死刑?

c++ - 这个 for 循环会在每次迭代时调用 set.size() 吗(set 是一个 vector )?

c++ - C++中的运算符重载

c++ - 在 std::pair 支撑初始化中复制 vs move

c++ - 为什么允许从 pair<int64_t,int64_t> 到 pair<int,int> 的隐式转换?

c++ - 标准对初始化

c++ - 什么是内部状态?

c++ - 为什么 clang 不使用自动返回类型省略此函数中的拷贝?