关于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);
}
}
boost::swap
声明为template <typename T1, typename T2>
,在其余代码中它们都处理相同的类型? void swap(T&, T&)
,我看到它是从swap_impl(T& left, T& right)
调用的全局函数。这不是冲突,因此是一个错误条件,因为swap_impl
也使用已定义交换的namespace std
吗? 答案 0 :(得分:19)
std::swap
专业化,因此当std::swap
和boost::swap
都在范围内时(std::swap
优先),您不会出现过载歧义错误。 swap
将优先于boost::swap
和std::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
)对于任何函数G
,并且对称地,ICS 1 ({{1} })既不比ICS 1 (G
)更好也不差;否则,- 让ICS i (
G
)表示隐式转换序列,它将列表中的 i -th参数转换为的类型i - 可行函数F
的第i个参数。 13.3.3.1定义了隐式转换序列,13.3.3.2定义了一个隐式转换序列比另一个转换序列更好的转换序列或更差转换序列的含义。鉴于这些定义,如果对于所有参数 i ,可行函数
F
被定义为更好函数而不是另一个可行函数F
。 ,ICS i (F1
)转换序列不比ICS i (F2
)差,然后
- 对于某些参数 j ,ICS j (
F1
)是比ICS j 更好的转换序列({{1 }}),或者,如果不是那样,F2
是非模板函数,F1
是函数模板特化,或者,如果不是,F2
和F1
是函数模板特化,F2
的函数模板比F1
的模板更专业,根据14.5中描述的部分排序规则.5.2,或者,如果不是,- 上下文是由用户定义的转换初始化(参见8.5,13.3.1.5和13.3.1.6)以及从
F2
的返回类型到目标类型的标准转换序列(即类型正在初始化的实体)是一个比返回类型F1
到目标类型的标准转换序列更好的转换序列。