理解C 11 SFINAE 中的「直接上下文」
C 11 標準指定了替換失敗導致硬編譯的條件錯誤或軟錯誤,只是從重載解析候選中丟棄模板。這項決定中的一個關鍵概念是「直接上下文」。
“直接上下文”的定義
標準中簡要提到了術語“直接上下文”,但其具體定義並未明確提供。然而,它經常與以下文本一起出現:
Note: The evaluation of the substituted types and expressions can result in side effects such as instantiation of template specializations, generation of implicitly-defined functions, etc. Such side effects are not in the “immediate context” and can result in the program being ill-formed.
此註釋表明在替換過程中發生的任何副作用,例如模板實例化或隱式函數定義,不被視為替換過程的一部分直接上下文。
確定直接上下文中的替換錯誤
至確定是否在直接上下文中發生替換錯誤,請考慮以下步驟:
範例
考慮以下範本和後備函數:
template<typename T> void func(typename T::type* arg); template<> void func(...);
案例1:假設: A 是一個有型別成員的模板,呼叫func::type*>(nullptr) 將會失敗並出現硬編譯錯誤,因為實例化A
情況2
:如果A 對char 有明確特化,則呼叫func::type*> ;(nullptr) 將實例化A以上是C 11 SFINAE 中的「直接上下文」是什麼以及它如何影響替換失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!