c++ - 将std::make_pair与std::string一起使用(非右值引用问题)

标签 c++ templates template-argument-deduction

std::pair<Url, std::string> UrlParser::parse()
{
    return std::make_pair({ extract_scheme(), extract_hostname(), extract_port(),
                 extract_path(), extract_filename() }, host_ip_);
}
host_ip_变量定义为
std::string host_ip_;
我懂了
UrlParser.cpp:91:64: error: no matching function for call to 'make_pair(<brace-enclosed initializer list>, std::string&)'
   91 |                  extract_path(), extract_filename() }, host_ip_);
问题出在host_ip_变量上。如果是std::string,那么返回它有什么问题?
我找到了c++11 rvalue references in `std::make_pair`,这说明我们无法使用非右值引用调用std::make_pair,因此我尝试了
std::make_pair({ extract_scheme(), extract_hostname(), extract_port(),
                     extract_path(), extract_filename() }, std::move(host_ip_));
但我明白了
error: no matching function for call to 'make_pair(<brace-enclosed initializer list>, std::remove_reference<std::__cxx11::basic_string<char>&>::type)'
   91 |                  extract_path(), extract_filename() }, std::move(host_ip_));
顺便说一句,为什么在提供的链接中,int是右值引用而const int不是?

最佳答案

这个问题与将host_ip_作为左值或右值传递给 std::make_pair 无关;两者都应该工作正常。相反,由于template argument deduction,大括号初始化列表{ extract_scheme(), extract_hostname(), extract_port(), extract_path(), extract_filename() }使得std::make_pair的第一个模板参数non-deduced context失败。

  1. The parameter P, whose A is a braced-init-list, but P is not std::initializer_list, a reference to one (possibly cv-qualified), or a reference to an array:

您可以显式传递Url
return std::make_pair(Url{ extract_scheme(), extract_hostname(), extract_port(),
//                    ^^^
             extract_path(), extract_filename() }, host_ip_);
或显式指定模板参数。
return std::make_pair<Url>({ extract_scheme(), extract_hostname(), extract_port(),
//                   ^^^^^
//                   specify the 1st template argument, left the 2nd one to be deduced
             extract_path(), extract_filename() }, host_ip_);

关于c++ - 将std::make_pair与std::string一起使用(非右值引用问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63156964/

相关文章:

c++ - 根据类模板的类型参数自动化类模板的大小参数

c++ - 是否可以忽略 c++11 的尾随返回类型特性而支持 c++14 的函数返回类型推导特性?

c# - 当对集合的引用未更改时,我应该返回集合吗?

c++ - 如何在类模板之外定义嵌套成员模板?

java - 使用模板模式设计通用流程

c++ - 非类型模板参数中的C++类类型:推导指南失败

c++ - 为什么参数推导在这个模板模板参数中不起作用

c++ - Mac C++/eclipse 无法调试 : Error while launching command: gdb --version

在 cuda 中具有动态分配的 C++ 类?

c++ - 如何编写适用于任何类型集合对象的 size() 函数?