首頁 > 後端開發 > C++ > 是什麼決定了 C 11 模板替換錯誤是硬錯誤還是軟錯誤?

是什麼決定了 C 11 模板替換錯誤是硬錯誤還是軟錯誤?

Patricia Arquette
發布: 2024-12-18 19:03:11
原創
340 人瀏覽過

What Determines Whether a C  11 Template Substitution Error Is a Hard or Soft Error?

C 11 模板替換中的直接上下文

C 11 標準引入了替換失敗不是錯誤(SFINAE),它允許在模板參數替換期間抑制硬編譯錯誤。然而,該標準定義了 SFINAE 適用的特定“直接上下文”,從而導致替換錯誤何時導致硬錯誤或軟錯誤存在一些不確定性。

立即上下文定義

標準將直接上下文定義為:

「只有函數類型及其直接上下文中的無效類型和表達式模板參數類型可能會導致推導失敗。」

這個定義很模糊,但非規範註解提供了提示:

「對替換類型和表達式的求值可能會導致副作用,例如......此類副作用不在“直接上下文”中,並且可能導致程序格式錯誤。確定在直接上下文中是否發生替換錯誤,請考慮以下決策過程:

第1 步驟:

辨識所有範本和決定替換結果所需的隱式定義函數。

    第 2 步:
  • 想像一下這些實體是在替換開始之前產生的。
  • 第 3 步:
  • 如果在此假設產生期間發生錯誤,它們不會出現在直接上下文中,並將導致硬錯誤。
  • 第 4 步:
  • 如果產生的所有實體都沒有錯誤,則替換期間的任何後續錯誤都不是錯誤,而是導致參數推導
  • 範例

硬錯誤: func>> - A 的實例化失敗,因為不允許指向引用的指標。

    參數推導失敗:
  • func>; - A 的實例化成功,但 A::type 不存在。
  • 參數推導失敗:
  • class B { void f(int); }; func::f - f 的隱式定義產生一個已刪除的成員函數。
  • 結論
  • 透過理解直接上下文的概念並使用透過上述決策過程,程式設計師可以更好地預測替換錯誤何時會導致硬錯誤或軟錯誤,從而能夠在C 11 中更有效地使用SFINAE模板。

以上是是什麼決定了 C 11 模板替換錯誤是硬錯誤還是軟錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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