假設我有一個具有一些專業化的類模板
template<typename T> struct A {};
template<typename T> struct A<T const> {};
template<typename T> struct A<T &> {};
當我實體化時,哪個專業化具有優先權A<const int&>?
我用 GCC 進行了一個測驗,它選擇了int&專業化。我認為這是規則,但我找不到說明的地方。
編輯:考慮到const int&匹配const Tfor T=int&,我犯了一個錯誤,因為模板不僅僅是“宏替換”。特別是,談論 const 參考(僅對 const 的參考)毫無意義。當前的兩個答案都幫助我弄清楚了。不幸的是,我只能選擇一個作為接受的答案,但謝謝你們。
uj5u.com熱心網友回復:
X&并且const Y永遠不能是相同型別的分解,因為參考不能是常量限定的。(鑒于using R=T&;,const R與 型別相同R,但這并不意味著它具有匹配任何內容的限定符。)因此,不需要排序,因為這兩個特化是不相交的。
uj5u.com熱心網友回復:
讓我們看看發生了什么。
宣告 1
template<typename T> struct A {}; //primary template
上面顯示的陳述句定義了一個主模板。這意味著它可以用于任何型別。
宣告 2
template<typename T> struct A<T const> {};//specialized for T const
上面的陳述句是一個專業化的主模板。這意味著,我們專注于T const. 也就是說,此特化將用于具有頂級 const 的模板引數。
宣告 3
template<typename T> struct A<T &> {};//specialized for T&
這次我們專門用于表單的模板引數的主模板T&。也就是說,我們專門用于左值參考的主要模板。此外,左值參考可以是對 const的參考或對 nonconst的參考。這意味著,此特化將用于所有左值參考(包括T&和const T&)。
現在讓我們回到你的問題:
當我實體化 A<const int&> 時,哪個專業化具有優先權?
當我們寫
A<const int&>
然后因為我們已經有了左值參考的規范,所以我已經在陳述句 3 的解釋中解釋了這個特殊規范的使用。
更多例子
const int i = 5;
A<decltype(i)> p;//this will use the T const specialization since the template argument has a top level const
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380303.html
