make_pair为什么不支持传递左值参数?

我正在向std::map中使用insert方法插入key-value对,我发现:

// ...
std::map<std::string, int> m;
m.insert(std::make_pair<std::string, int>("hello", 10));
// ...

可以正常工作,但是:

// ...
std::string s1 = "hello";
m.insert(std::make_pair<std::string, int>(s1, 10);
// ...

会报错(没有与参数列表匹配的函数模板)。我查看了库的实现,其声明为make_pair(T1&& val1, T2&& val2);并发现这使用了引用折叠规则,因此我尝试:

// ...
std::string s1 = "hello";
m.insert(std::make_pair<std::string&, int>(s1, 10);
// ...

然后编译成功了,此时pair中存放的是s1的引用,但这仍然令我感到奇怪,这是最好的写法吗?可不可以声明为std::map<std::string&, int> m;
以及为什么std::make_pair不像std::swap那样直接将参数声明为左值引用?

阅读 4.8k
1 个回答

你应该用

std::string s1 = "hello";
m.insert(std::pair<std::string, int>(s1, 10);

pair 构造是既支持左值又支持右值的

make_pair 的用法是不需要声明类型的时候,譬如:

m.insert(std::make_pair("hello", 10));

所以 make_pair 是强制右值的,你又用make_pair,又给出类型是一种非常规用法。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题