effective c++中,条款25:考虑写出一个不抛出异常的swap函数 中的一个疑问。
迷茫
迷茫 2017-04-17 11:06:58
0
1
571

书中提到,如果swap的缺省实现对你的class或class template 效率不足,试着做一下事情

  1. 提供一个public swap成员函数,让它高效的置换你的类型的两个对象。
  2. 在你的class 或template 所在的命名空间内提供一个non-member swap, 并另它调用上述swap成员。
  3. 如果你正编写一个class( 而非class template), 为你的class 特化std:swap.并另它调用你的swap函数。

最后,如果你调用swap, 请确定包含一个using声明式,以便让std:swap在你的成员函数内曝光课件,然后不加任何namesapce修饰符,赤裸裸调用swap。

我的疑问是有了第二点,还为什么要第三点? 因为根据augument-dependent lookup,就能找到class 或tempalte命名空间的swap,然后就会调用之。为什么还要有第三点?感觉没必要啊。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(1)
大家讲道理

這個在書中也有描述:

  1. Effective C 推薦調用時寫成如下形式:
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,因而造成性能問題。

總得來說,第三條是避免陷阱的一種做法。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板