关注std::make_pair的C++11实现

2018-11-19  本文已影响36人  dnsir

1 为什么

因为c++增加了通用右值引用(T &&),标准库为了提升性能,很多标准库都进行一些重写,std::make_pair使用也发生了变化。

2 std::make_pair源码

#if __cplusplus >= 201103L
  // NB: DR 706.
  template<class _T1, class _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<class _T1, class _T2>
    inline pair<_T1, _T2>
    make_pair(_T1 __x, _T2 __y)
    { return pair<_T1, _T2>(__x, __y); }
#endif

简而言之对于c++新标准来说,__T1和__T2是自动推导,旧的标准是必须指明参数类型。
新版本使用实例:

std::queue<std::pair<int, int> > q;
q.push(std::make_pair(1,2));   //不需要指定模板参数

旧版本使用实例

std::queue<std::pair<int, int> > q;
q.push(std::make_pair<int, int>(1,2));

注意std::make_pair使用区别。

上一篇 下一篇

猜你喜欢

热点阅读