也许我是傻瓜,但我不知道这段代码的问题是什么。我开始怀疑我的工具了。我正在使用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'
答案 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));