Rumah > Soal Jawab > teks badan
书中提到,如果swap的缺省实现对你的class或class template 效率不足,试着做一下事情
最后,如果你调用swap, 请确定包含一个using声明式,以便让std:swap在你的成员函数内曝光课件,然后不加任何namesapce修饰符,赤裸裸调用swap。
我的疑问是有了第二点,还为什么要第三点? 因为根据augument-dependent lookup,就能找到class 或tempalte命名空间的swap,然后就会调用之。为什么还要有第三点?感觉没必要啊。
大家讲道理2017-04-17 11:08:58
这个在书中也有描述:
template<typename T>
void doSomething(T& obj1, T& obj2)
{
using std::swap;
swap(obj1, obj2);
}
这种写法可以通过ADL(argument-dependent lookup)找到特化在类里的non-member function。
2. 在某些情况(其实是很多情况),会被不恰当的写成如下代码:
template<typename T>
void doSomething(T& obj1, T& obj2)
{
std::swap(obj1, obj2);
}
如果不提供在std namespace中的特化(第三条),以上代码只会使用非特化的std::swap,因而造成性能问题。
总得来说,第三条是避免陷阱的一种做法。