首页 > 解决方案 > l 值如何传递给 std::make_pair

问题描述

std::make_pair C++14 以后只有一种实现

模板< class T1, class T2 > constexpr std::pair<V1,V2> make_pair( T1&& t, T2&& u );

这两个参数都是 R 值参考,根据这个

R 值引用不能用 l 值初始化。

    int i = 1;
    char ch = 'a';
    std::unordered_map<int, char> mp;
    mp.insert(make_pair<int,char>(i, ch));

因此,当我尝试在上面的代码中使用 make_pair 时,它会正确抛出错误error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'

但是,如果我更改删除模板参数并将其调用为

mp.insert(make_pair(i, ch));

我很困惑这是如何工作的,i并且ch两者都是 L 值。模板参数解析是否将 L 值转换为 R 值,或者它是如何工作的?

标签: c++c++11templatestemplate-argument-deductionforwarding-reference

解决方案


的参数make_pair没有声明为右值引用,而是转发引用

转发引用是一种特殊的引用,它保留函数参数的值类别,从而可以通过 std::forward 转发它。转发参考是:

  1. 函数模板的函数参数声明为对同一函数模板的 cv 非限定类型模板参数的右值引用:

在模板参数推导的帮助下,转发引用适用于左值和右值。当被传递一个左值时,模板参数会被推导出为左值引用,在引用折叠后,函数参数也是左值引用。在传递右值时,模板参数将被推断为非引用,函数参数为右值引用。

另一方面,如果您明确指定模板参数 like make_pair<int,char>(...),则函数参数相应地变为右值引用。


推荐阅读