首頁 > 後端開發 > C++ > C 11 SFINAE 中的「直接脈絡」由什麼構成?

C 11 SFINAE 中的「直接脈絡」由什麼構成?

Mary-Kate Olsen
發布: 2024-12-10 18:12:11
原創
808 人瀏覽過

What Constitutes the

C 11 SFINAE 中的「立即上下文」到底是什麼?

「立即上下文」的概念在 C 11 的替換中至關重要失敗不是錯誤 (SFINAE) 習語。根據 C 11 標準,只有函數類型及其範本參數類型的「直接上下文中」的無效類型和表達式才會導致推導失敗。

初步理解

標準在註釋中提供了有限的提示:「替換類型和表達式的計算可能會導致副作用,例如類模板特化、函數模板特化、隱式函數產生等」這些副作用不被視為「直接上下文」的一部分。

決策程序

要確定「直接上下文」是否發生替換錯誤,請遵循以下步驟程序:

  1. 確定必要的模板和函數:考慮參數替換所需的所有模板和隱式定義函數。
  2. 預先實例化步驟:想像一下在替換之前產生這些模板和函數。
  3. 直接錯誤: 如果在此預實例化步驟中發生任何錯誤,它們不會出現在直接上下文中並導致硬編譯
  4. 推演失敗:如果預實例化成功,則後續替換過程中出現的錯誤都不是錯誤,而是推演失敗。

具體範例

  • 範例1 (硬錯誤):
範例1 (硬錯誤):
template<typename T>
void func(typename T::type* arg);
登入後複製
登入後複製
func<A<int&>&>(nullptr); // T::type* is invalid, causing a hard error.
登入後複製
    例如1 (硬錯誤) >
  • 範例2(推導失敗):
template<typename T>
void func(typename T::type* arg);
登入後複製
登入後複製
template<>
struct A<char> {};
登入後複製
func<A<char>>(nullptr); // T::type* is not defined, leading to a deduction failure.
登入後複製

結論

「直接被除了上下文」指的是可以被除了上下文必要的預實例化步驟之外,不需要額外的模板或函數生成即可解決。預實例化階段發生錯誤會導致硬編譯錯誤,而後續替換階段發生錯誤會導致推演失敗。

以上是C 11 SFINAE 中的「直接脈絡」由什麼構成?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板