C++11 make_pair和pair
先看这段代码:#include <iostream>int main() {std::string str = "hello world";auto error = std::make_pair<int, std::string>(0, str);// errorauto success = std::pair<int, std::string>(0, str)
·
先看这段代码:
#include <iostream>
int main() {
std::string str = "hello world";
auto error = std::make_pair<int, std::string>(0, str); // error
auto success = std::pair<int, std::string>(0, str);
return 0;
}
在`make_pair`时会报错:
error: no matching function for call to ‘make_pair<int, std::__cxx11::string>(int, std::__cxx11::string&)’
让我们看看`make_pair`在c++11中的实现:
/**
* @brief A convenience wrapper for creating a pair from two objects.
* @param __x The first object.
* @param __y The second object.
* @return A newly-constructed pair<> object of the appropriate type.
*
* The standard requires that the objects be passed by reference-to-const,
* but LWG issue #181 says they should be passed by const value. We follow
* the LWG by default.
*/
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 181. make_pair() unintended behavior
#if __cplusplus >= 201103L
// NB: DR 706.
template<typename _T1, typename _T2>
constexpr pair<typename __decay_and_strip<_T1>::__type,
typename __decay_and_strip<_T2>::__type>
make_pair(_T1&& __x, _T2&& __y)
{
typedef typename __decay_and_strip<_T1>::__type __ds_type1;
typedef typename __decay_and_strip<_T2>::__type __ds_type2;
typedef pair<__ds_type1, __ds_type2> __pair_type;
return __pair_type(std::forward<_T1>(__x), std::forward<_T2>(__y));
}
#else
template<typename _T1, typename _T2>
inline pair<_T1, _T2>
make_pair(_T1 __x, _T2 __y)
{ return pair<_T1, _T2>(__x, __y); }
#endif
可以看到`make_pair`在不同版本有两种实现,最新版本中使用的是 `make_pair(_T1&& __x, _T2&& __y)`,`_T2&&`只能采用Rvalues,而`std::string str`中的`str`为左值,所以会error。
可参考`#else`中的代码,在原本使用到`std::make_pair`的地方,换成`std::pair`即可。
更多推荐
已为社区贡献1条内容
所有评论(0)