有关boost :: swap的问题

Fan*_*c23 14 c++ boost

几个问题boost::swap.请参考下面的代码,它基本上是一个剪切粘贴boost/swap.hpp.我指的是库版本1.43.0.

namespace boost_swap_impl
    {
      template<class T>
      void swap_impl(T& left, T& right)
      {
        using namespace std;//use std::swap if argument dependent lookup fails
        swap(left,right);
      }

  template<class T, std::size_t N>
  void swap_impl(T (& left)[N], T (& right)[N])
  {
    for (std::size_t i = 0; i < N; ++i)
    {
      ::boost_swap_impl::swap_impl(left[i], right[i]);
    }
  }
}

namespace boost
{
  template<class T1, class T2>
  void swap(T1& left, T2& right)
  {
    ::boost_swap_impl::swap_impl(left, right);
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么boost::swap声明为template <typename T1, typename T2>在其余代码中它处理相同类型的时间?
  2. 如果我定义自己的全局函数,void swap(T&, T&)我会看到它是从中调用的全局函数swap_impl(T& left, T& right).这不是冲突,因此也是一个错误条件,因为它swap_impl也使用了namespace std定义的交换?

ild*_*arn 20

  1. 这使得它不太专业的比std::swap,所以你不要超载歧义错误时都std::swapboost::swap在范围(std::swap将优先考虑).
  2. 不,非模板总是在模板的优先级重载期间,所以一个命名空间范围的非模板swap将优先于boost::swapstd::swap(将命名空间范围的模板swap超载,UDT -认为部分专业化,但不是真的. ).请注意,与之不同std::swap,boost::swap是明确写入以利用ADL.

以下是关于这两点的C++ 03标准所说的内容 - [over.match.best](§13.3.3/ 1):

定义ICS i(F)如下:

  • 如果F是一个静态成员函数,ICS 1(F)被定义为使得ICS 1(F)既不大于ICS更好也不变坏1(G),用于任何功能G,并且,对称地,ICS 1(G)既不大于ICS更好也不变坏1(F); 除此以外,
  • 让ICS (F)表示,其将所述的隐式转换的序列在列表中的类型第参数可行函数的第参数F.13.3.3.1定义了隐式转换序列,13.3.3.2定义了一个隐式转换序列比另一个更好的转换序列或更差转换序列的含义.

给定这些定义,如果对于所有参数i,ICS i()不是比ICS i()更差的转换序列,则可行函数F1被定义为比另一个可行函数更好的函数,然后F2F1F2

  • 对于某些参数j,ICS j(F1)是比ICS j(F2)更好的转换序列,或者,如果不是,
  • F1是一个非模板函数,F2是一个函数模板特化,或者,如果不是,
  • F1并且F2是函数模板特化,并且函数模板F1F2根据14.5.5.2中描述的部分排序规则的模板更专业,或者,如果不是,
  • 上下文是由用户定义的转换初始化(见8.5,13.3.1.5和13.3.1.6),从返回类型F1到目标类型的标准转换序列(即,被初始化的实体的类型)是转换序列比从返回类型F2到目标类型的标准转换序列更好.