84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
书中提到,如果swap的缺省实现对你的class或class template 效率不足,试着做一下事情
最后,如果你调用swap, 请确定包含一个using声明式,以便让std:swap在你的成员函数内曝光课件,然后不加任何namesapce修饰符,赤裸裸调用swap。
我的疑问是有了第二点,还为什么要第三点? 因为根据augument-dependent lookup,就能找到class 或tempalte命名空间的swap,然后就会调用之。为什么还要有第三点?感觉没必要啊。
业精于勤,荒于嬉;行成于思,毁于随。
这个在书中也有描述:
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,因而造成性能问题。
总得来说,第三条是避免陷阱的一种做法。
这个在书中也有描述:
这种写法可以通过ADL(argument-dependent lookup)找到特化在类里的non-member function。
2. 在某些情况(其实是很多情况),会被不恰当的写成如下代码:
如果不提供在std namespace中的特化(第三条),以上代码只会使用非特化的std::swap,因而造成性能问题。
总得来说,第三条是避免陷阱的一种做法。