如何将L值传递给std :: make_pair

问题描述

[{ 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的功能模板的
  1. function参数 引用相同的cv-unqualified类型模板参数 功能模板:

template argument deduction的帮助下,转发引用可同时用于左值和右值。当传递左值时,模板参数将推导为左值参考,参考折叠后,功能参数也为左值参考。传递右值时,将推导模板参数为非引用,函数参数为右值参考。

另一方面,如果您像make_pair<int,char>(...)一样显式指定模板参数,则函数参数将相应地成为右值引用。

,

answer by songyuanyao已经解释了大多数情况。不过,我想为如何使用显式模板参数来完成这项工作做出贡献。您已完成大部分工作,但没有走最后一步。

我很困惑ich都是L值的情况。

完全正确。您需要左值,您可以在模板参数中指定该值:

std::make_pair<int &,char &>(i,ch)

或在更多情况下有效的表格:

std::make_pair<const int &,const char &>(i,ch)

多写一点,但是如果由于某种原因而导致参数推导失败,则需要

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...