You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何指定显式类型的std::make_pair<string,string>()无法处理const string&参数?

显式指定std::make_pair模板参数后无法编译的原因

无法编译的代码

#include <string>
#include <utility>

using namespace std;

int main() {
    const string s = "12345";
    const string& r = s;

    auto p = std::make_pair<string, string>(r, r);
}

编译器报错

  • GCC报错:
    error: cannot bind rvalue reference of type ‘std::__cxx11::basic_string<char>&&’ to lvalue of type ‘const std::string’ {aka ‘const std::__cxx11::basic_string<char>’}
    
  • Clang报错:
    error: no matching function for call to 'make_pair'
    

问题原因

当显式指定std::make_pair<string, string>时,make_pair的函数参数会被实例化为string&&(右值引用)——这是因为std::make_pair的模板实现采用了完美转发的写法,模板参数T1、T2对应的参数类型是T1&&、T2&&。

而你传入的r是const string&类型的左值,C++里右值引用(string&&)只能绑定到右值(比如临时对象)或者将亡值,不能直接绑定左值,因此编译器报错。

你可能误以为显式指定模板参数后,make_pair会自动用const string&构造新的string,但实际上make_pair的参数是右值引用类型,它不会自动做类型转换,而是要求传入的参数能直接绑定到对应的引用类型。

可行的解决方法

方法1:传入临时对象(你提供的可行代码)

通过string(r)构造临时的string对象,它属于右值,可以绑定到string&&参数:

auto p = std::make_pair<string, string>(string(r), string(r));

方法2:不指定模板参数,让编译器自动推导

让make_pair根据传入的const string&自动推导模板参数,此时会生成pair<const string&, const string&>(如果仅需要引用);如果希望构造pair<string, string>,编译器也会自动通过const string&构造新的string对象:

auto p = std::make_pair(r, r);

方法3:直接使用std::pair构造

std::pair的构造函数支持接收const T&类型的参数,可以直接用r构造pair<string, string>:

auto p = std::pair<string, string>(r, r);

内容的提问来源于stack exchange,提问作者MWB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:35:17