为什么在函数指针的情况下通用引用概念不适用于映射插入
Why Universal Reference concept not working for map insert in case of function pointers
如果我不明确使用 std::pair 和地图插入,有人能解释为什么下面的代码不起作用吗:
#include <iostream>
#include <string>
#include <map>
#include <memory>
typedef std::shared_ptr<int>(*CreatorFunction)();
std::shared_ptr<int> test()
{
std::shared_ptr<int> p(new int);
return p;
}
int main()
{
std::map<int, CreatorFunction> tmap;
tmap.insert(1,test); //this doesn't work
tmap.insert(std::pair<int,CreatorFunction>(1,test)); //this works
return 0;
}
我的理解是在 c++14 中我们不需要使用 std::pair 因为插入函数定义已更改为接受通用引用,如下所示:
template <class P> pair<iterator,bool> insert (P&& val);
std::map::insert
中没有任何带有两个参数的重载,您应该使用 std::make_pair
。请参阅下面的代码段
#include <iostream>
#include <string>
#include <map>
#include <memory>
#include <functional> // for std::function.
// typedef std::shared_ptr<int>(*CreatorFunction)();
typedef std::function<std::shared_ptr<int>()> CreatorFunction; // The c++ way.
// Take a look at this function. std::shared_ptr<int> will automatically destroy the int* and might result in undefined.
std::shared_ptr<int> test()
{
std::shared_ptr<int> p(new int);
return p;
}
int main()
{
std::map<int, CreatorFunction> tmap;
tmap.insert(std::make_pair(1,test)); // edited this line
tmap.insert(std::pair<int,CreatorFunction>(1,test)); // this works
return 0;
}
如果我不明确使用 std::pair 和地图插入,有人能解释为什么下面的代码不起作用吗:
#include <iostream>
#include <string>
#include <map>
#include <memory>
typedef std::shared_ptr<int>(*CreatorFunction)();
std::shared_ptr<int> test()
{
std::shared_ptr<int> p(new int);
return p;
}
int main()
{
std::map<int, CreatorFunction> tmap;
tmap.insert(1,test); //this doesn't work
tmap.insert(std::pair<int,CreatorFunction>(1,test)); //this works
return 0;
}
我的理解是在 c++14 中我们不需要使用 std::pair 因为插入函数定义已更改为接受通用引用,如下所示:
template <class P> pair<iterator,bool> insert (P&& val);
std::map::insert
中没有任何带有两个参数的重载,您应该使用 std::make_pair
。请参阅下面的代码段
#include <iostream>
#include <string>
#include <map>
#include <memory>
#include <functional> // for std::function.
// typedef std::shared_ptr<int>(*CreatorFunction)();
typedef std::function<std::shared_ptr<int>()> CreatorFunction; // The c++ way.
// Take a look at this function. std::shared_ptr<int> will automatically destroy the int* and might result in undefined.
std::shared_ptr<int> test()
{
std::shared_ptr<int> p(new int);
return p;
}
int main()
{
std::map<int, CreatorFunction> tmap;
tmap.insert(std::make_pair(1,test)); // edited this line
tmap.insert(std::pair<int,CreatorFunction>(1,test)); // this works
return 0;
}