我想将两个局部变量成对并返回,这是我的代码:
#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));
,则编译将成功。那我想念什么?
答案 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&)
,一切正常。