问题描述
在[{
name: steak,unit: piece,totalQuantity: 20
},{
name: bacon,unit: kg,totalQuantity: 112
}
]
there is only one implementation C++14 onwards
template
constexpr std :: pair make_pair(T1 && t,T2 && u);
这两个参数都是R值引用,并且根据this
R值引用不能使用l值初始化。
std::make_pair
因此,当我尝试使用上述代码中的make_pair时,它会正确引发错误 int i = 1;
char ch = 'a';
std::unordered_map<int,char> mp;
mp.insert(make_pair<int,char>(i,ch));
。
但是,如果我进行更改,它对于上面的代码将非常有效,请删除模板参数并将其称为
error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'
我感到困惑,因为mp.insert(make_pair(i,ch));
和i
都是L值。模板参数解析是将L值转换为R值还是像这样工作?
解决方法
make_pair
的参数未声明为右值引用,而是forwarding reference。
转发引用是一种特殊的引用,可以保留 函数参数的值类别,使 通过std :: forward转发它。转发参考是:
声明为rvalue的功能模板的
- function参数 引用相同的cv-unqualified类型模板参数 功能模板:
在template argument deduction的帮助下,转发引用可同时用于左值和右值。当传递左值时,模板参数将推导为左值参考,参考折叠后,功能参数也为左值参考。传递右值时,将推导模板参数为非引用,函数参数为右值参考。
另一方面,如果您像make_pair<int,char>(...)
一样显式指定模板参数,则函数参数将相应地成为右值引用。
answer by songyuanyao已经解释了大多数情况。不过,我想为如何使用显式模板参数来完成这项工作做出贡献。您已完成大部分工作,但没有走最后一步。
我很困惑
i
和ch
都是L值的情况。
完全正确。您需要左值,您可以在模板参数中指定该值:
std::make_pair<int &,char &>(i,ch)
或在更多情况下有效的表格:
std::make_pair<const int &,const char &>(i,ch)
多写一点,但是如果由于某种原因而导致参数推导失败,则需要
。