几个问题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)
boost::swap
声明为template <typename T1, typename T2>
在其余代码中它处理相同类型的时间?void swap(T&, T&)
我会看到它是从中调用的全局函数swap_impl(T& left, T& right)
.这不是冲突,因此也是一个错误条件,因为它swap_impl
也使用了namespace std
定义的交换?ild*_*arn 20
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
)既不大于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
被定义为比另一个可行函数更好的函数,然后F2
F1
F2
- 对于某些参数j,ICS j(
F1
)是比ICS j(F2
)更好的转换序列,或者,如果不是,F1
是一个非模板函数,F2
是一个函数模板特化,或者,如果不是,F1
并且F2
是函数模板特化,并且函数模板F1
比F2
根据14.5.5.2中描述的部分排序规则的模板更专业,或者,如果不是,- 上下文是由用户定义的转换初始化(见8.5,13.3.1.5和13.3.1.6),从返回类型
F1
到目标类型的标准转换序列(即,被初始化的实体的类型)是转换序列比从返回类型F2
到目标类型的标准转换序列更好.
归档时间: |
|
查看次数: |
1321 次 |
最近记录: |