错误:没有匹配的函数来调用“ make_pair”

rea*_*esk 0 c++

我想将两个局部变量放入一对并返回,这是我的代码:

#include <utility>
class Foo {

};

class Bar {

};

std::pair<Foo, Bar> test() {
  Foo foo;
  Bar bar;
  return std::make_pair<Foo, Bar>(foo, bar);
}
Run Code Online (Sandbox Code Playgroud)

我得到了

main.cpp:92:10: error: no matching function for call to 'make_pair'   
/usr/bin/../lib/gcc/x86_64-linux-gnu/7.4.0/../../../../include/c++/7.4.0/bits/stl_pair.h:524:5:
note: candidate function not viable: no known conversion from 'Foo' to 'Foo &&' for 1st argument
    make_pair(_T1&& __x, _T2&& __y)
Run Code Online (Sandbox Code Playgroud)

如果我使用return std::make_pair<Foo, Bar>(std::move(foo), std::move(bar));,编译将成功。那我想念什么?

raf*_*x07 8

template< class T1, class T2 >
std::pair<V1,V2> make_pair( T1&& t, T2&& u );
Run Code Online (Sandbox Code Playgroud)

因为您将显式类型明确地放置在模板参数列表中<Foo,Bar>,所以禁用了类型推导,并且make_pair具有签名。make_pair(Foo&&, Bar&&).您正在传递左值,因此左值不能绑定到右值引用。不要输入<>或使用类型pair<Foo,Bar>(foo,bar)

另一个解决方案是依靠类型推导:make_pair(foo,bar)然后是签名make_pair(Foo&, Bar&),一切正常。