声明模板类型以调用make_pair

时间:2014-01-19 23:52:52

标签: c++ c++11 clang libc++

也许我是傻瓜,但我不知道这段代码的问题是什么。我开始怀疑我的工具了。我正在使用Clang(C ++ 11)及其libc ++。如果这是我的错,我道歉并提前感谢谁指出我的愚蠢,但如果不是,也许这是一个更深层次的问题..

std::map<int, bool> map_;

map_.insert(std::make_pair<int, bool>(5, true)); //Use a literal, compiles OK

int x = 5;
map_.insert(std::make_pair<int, bool>(x, true)); //Use a local of same type, compile error: 'no known conversion from 'int' to 'int &&' for 1st argument'

1 个答案:

答案 0 :(得分:8)

std::make_pair对其参数采用"universal reference"。通用引用可以绑定到几乎任何东西。这是实际的签名:

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

当您明确提供类型(不必要地添加)时,它会将函数调用转换为:

... ( int&& t, bool&& u );

意味着参数不再是通用引用,而是rvalue-references。 Rvalue-references只能绑定到rvalues,而不是lvalues,因此第一个参数的错误。

此问题的解决方案是允许模板参数推断完成其工作:

map_.insert(std::make_pair(x, true));