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

时间:2019-09-10 11:11:01

标签: c++

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

#include <utility>
class Foo {

};

class Bar {

};

std::pair<Foo, Bar> test() {
  Foo foo;
  Bar bar;
  return std::make_pair<Foo, Bar>(foo, bar);
}

我知道了

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)

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

1 个答案:

答案 0 :(得分:8)

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

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

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