先看这段代码:

#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`即可。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐