读书人

VS2012带的C++11库中std:make_pair的有

发布时间: 2012-11-09 10:18:48 作者: rapoo

VS2012带的C++11库中std::make_pair的问题
这是VS2012RTM版本中带的标准库中std::make_pair的实现,而且我只找到这一个实现,没有其它重载和特化版本。

C/C++ code
template<class _Ty1,    class _Ty2> inline    pair<typename _Unrefwrap<_Ty1>::type,        typename _Unrefwrap<_Ty2>::type>        make_pair(_Ty1&& _Val1, _Ty2&& _Val2)    {    // return pair composed from arguments    typedef pair<typename _Unrefwrap<_Ty1>::type,        typename _Unrefwrap<_Ty2>::type> _Mypair;    return (_Mypair(_STD forward<_Ty1>(_Val1),        _STD forward<_Ty2>(_Val2)));    }


两个参数都是非常量右值引用,非常量右值是不能绑定到左值的。如果在代码中使用下面的代码是编译不过的了。
C/C++ code
T1 t1;T2 t2;std::make_pain(t1, t2);

当你要往一个std::map中添加数据时,可能得换成下面这样的语法了。
C/C++ code
std::pair(t1, t2);


不知是否还有其他的解决方法,请各位指点。

[解决办法]
模板里右值引用碰到左值会变成左值引用,以此来实现完美转发。

但是一般函数右值引用就不能传入左值。

make_pair会自动推导类型,不会自动推导用什么make_pair。。。直接声明得了

而且std::pair很诡异好像自带隐式类型转换,会根据类型能否转换自动匹配。


[解决办法]
探讨

模板里右值引用碰到左值会变成左值引用,以此来实现完美转发。

但是一般函数右值引用就不能传入左值。

make_pair会自动推导类型,不会自动推导用什么make_pair。。。直接声明得了

而且std::pair很诡异好像自带隐式类型转换,会根据类型能否转换自动匹配。

读书人网 >C++

热点推荐