樣板和名稱解析
在樣板定義中共有三種類型的名稱。
區域宣告名稱,包括樣板的名稱本身和樣板定義中宣告的任何名稱。
來自樣板定義封閉範圍之外的名稱。
以某種方式取決於樣板引數的名稱,也稱為相依名稱。
雖然前兩個名稱也屬於類別和函式範圍,不過在樣板定義中需要使用名稱解析的特殊規則來處理相依名稱增加的複雜度。 這是因為編譯器在樣板具現化之前對這些名稱幾乎一無所知,它們可能是完全不同的類型,取決於所使用的樣板引數。 非相依名稱會根據一般規則和樣板的定義點進行搜尋。 這些名稱 (與樣板引數無關) 只會針對所有樣板特製化搜尋一次。 相依名稱會在樣板具現化之後再進行搜尋,並且會分別對每個特製化進行搜尋。
類型取決於其相關的樣板引數。 具體來說,類型是相依的,如果其符合下列各項:
樣板引數本身:
T
具有限定性的限定名稱,包含一個相依類型:
T::myType
一個限定名稱,但未限定部可識別一個相依類型:
N::T
基底類型為相依類型的 const 或 volatile 類型:
const T
以相依類型為基礎的指標、參考、陣列或函式指標類型:
T *, T &, T [10], T (*)()
一個陣列,其大小取決於樣板參數:
template <int arg> class X { int x[arg] ; // dependent type }
從樣板參數建構的範本類型:
T<int>, MyTemplate<T>
類型相依和值相依
相依於樣板參數的名稱和運算式會分類為類型相依或值相依,取決於樣板參數是類型參數或值參數。 此外,在具有類型相依的樣板中宣告的所有識別項在樣板引數上視為值相依,如使用值相依運算式初始化的整數或列舉類型。
類型相依和值相依運算式是一種包含類型相依或值相依變數的運算式。 根據範本所使用的參數,這些運算式可能會有不同的語意。