我正在向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
那样直接将参数声明为左值引用?
你应该用
pair 构造是既支持左值又支持右值的
make_pair 的用法是不需要声明类型的时候,譬如:
所以 make_pair 是强制右值的,你又用make_pair,又给出类型是一种非常规用法。