2011-05-24 67 views
13

幾個關於boost::swap的問題。請參考下面的代碼,該代碼基本上是從boost/swap.hpp的剪貼。我指的是庫版本1.43.0。關於boost :: swap的問題

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); 
    } 
} 
  1. 爲什麼聲明boost::swaptemplate <typename T1, typename T2>當它是所有處理同一類型的代碼的其他人呢?
  2. 如果我定義了我自己的全局函數void swap(T&, T&)我看到它是從swap_impl(T& left, T& right)調用的全局函數。這是不是衝突,因此是錯誤條件,因爲swap_impl也使用namespace std它已定義的交換?

回答

19
  1. 這使得它不太專業比std::swap所以你不要超載歧義錯誤當兩個std::swapboost::swap在範圍(std::swap將優先)。
  2. 沒有,非模板總是有重載期間通過模板的優先級,這樣一個命名空間範圍的非模板swap將優先於boost::swapstd::swap(如超載,UDT –命名空間範圍的模板swap認爲部分 - 專業化,但不是真的..)。請注意,與std::swap不同,boost::swap是明確寫入以利用ADL

下面介紹一下C++標準03就具有這兩點– [over.match.best(§13.3.3/ 1)說:

定義ICS F )如下:

  • 如果F是一個靜態成員函數,ICS (F)是,ICS 1定義爲使得(F)既不大於ICS (G),用於任何功能G更好也不差,和,對稱地,ICS (G)既不大於ICS (F)更好也不差;否則,
  • 設ICS F)表示的是,在列表中的個參數轉換爲可行函數F個參數的類型的隱式轉換序列。 13.3.3.1定義了隱式轉換序列,13.3.3.2定義了一個隱式轉換序列是一個比另一個更好的轉換序列或更糟的轉換序列。

根據這些定義,一個可行的功能F1被定義爲比另一種可行的功能F2一個更好功能,如果對所有的參數,ICS F1)不大於一個糟糕的轉換序列ICS F2),然後

  • 對於一些參數Ĵ,ICS ĴF1)比ICS Ĵ更好的轉換序列(F2),或者,如果不是,
  • F1是一個非模板函數和F2是一個函數模板特,或者,如果不是,
  • F1F2是功能模板特,而對於F1函數模板是根據在14.5.5.2描述的部分排序規則比模板F2更專門的,或者,如果不是,
  • 的上下文是通過用戶定義的轉換進行初始化(請參見8.5,13.3.1.5和1 3.3.1.6),並且從返回類型F1到目標類型(即,正在初始化的實體的類型)的標準轉換序列是比從返回類型F2到目標類型的標準轉換序列更好的轉換序列。
+0

@jam:+1。你能否指點我的C++參考標準部分,討論非模板優先於模板代碼? – Fanatic23 2011-05-24 18:49:34

+0

@ Fanatic23:用標準引文編輯的答案。 – ildjarn 2011-05-24 19:05:33

+0

@ildjarn:恐怕你的筆記[爭論](http://stackoverflow.com/questions/9170247/does-c11-change-the-behavior-of-explicitly-calling-stdswap-to-ensure- ADL-LOC)。我認爲也是這樣,但也許不是。 – GManNickG 2012-02-07 02:33:48