首頁 >後端開發 >C++ >C 11 SFINAE 中的「直接上下文」是什麼以及它如何影響替換失敗?

C 11 SFINAE 中的「直接上下文」是什麼以及它如何影響替換失敗?

Barbara Streisand
Barbara Streisand原創
2024-12-12 19:10:11966瀏覽

What is the

理解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.

此註釋表明在替換過程中發生的任何副作用,例如模板實例化或隱式函數定義,不被視為替換過程的一部分直接上下文。

確定直接上下文中的替換錯誤

至確定是否在直接上下文中發生替換錯誤,請考慮以下步驟:

  1. 辨識副作用:想像一下實例化所有範本並定義範本參數替換所需的所有隱式函數.
  2. 檢查錯誤:如果在此「準備」階段出現任何錯誤,它們不屬於立即處理的一部分上下文並導致硬編譯錯誤。
  3. 替換參數:一旦產生了所有必要的實例化和定義且沒有錯誤,請將參數替換為函數模板的簽章。
  4. 在替換過程中檢查錯誤:如果在最後的替換步驟中出現任何錯誤,它們不是真正的錯誤,而是演繹錯誤

範例

考慮以下範本和後備函數:

template<typename T>
void func(typename T::type* arg);

template<>
void func(...);
  1. 案例1
  2. 案例1

案例1:假設: A 是一個有型別成員的模板,呼叫func::type*>(nullptr) 將會失敗並出現硬編譯錯誤,因為實例化A (在準備期間)會建立一個指向引用的無效指針。

情況2

:如果A 對char 有明確特化,則呼叫func::type*> ;(nullptr) 將實例化A; (準備成功),但隨後的A::type 替換(最後一步)失敗,因為它不存在。這會導致推演失敗,並使用後備函數。 結論透過理解直接上下文的概念,您可以更好地識別何時替換錯誤將導致硬編譯錯誤或軟推導失敗,從而可以在C 11 中有效使用SFINAE。

以上是C 11 SFINAE 中的「直接上下文」是什麼以及它如何影響替換失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn