为何指定显式类型的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
相关产品推荐
相关产品推荐

