首頁 > 後端開發 > C++ > Microsoft Visual C 的兩階段範本尋找與標準有何不同,後果是什麼?

Microsoft Visual C 的兩階段範本尋找與標準有何不同,後果是什麼?

Susan Sarandon
發布: 2024-12-07 15:52:13
原創
521 人瀏覽過

How Does Microsoft Visual C  's Two-Phase Template Lookup Differ from the Standard, and What are the Consequences?

Microsoft Visual C 中被誤解的兩階段模板查找

簡介

兩階段模板實例化,也稱為簡介

兩階段模板實例化,也稱為早期和晚期查找是C 模板編程的一個重要方面。然而,微軟對該功能的 Visual C (MSVC) 實現因據稱不充分而面臨審查。

理論中的兩階段查找

在標準 C 編譯器中,兩階段查找適用於模板函數和類別。在第一階段,編譯器執行語法檢查,識別具有適當名稱的聲明。實際的名稱查找和綁定會推遲到第二階段,也就是在模板實例化期間發生的事情。

MSVC 的有限實現

  • 與預期相反,MSVC 的模板查找是有限的。在第一階段,它僅執行基本語法檢查。問題出現在第二階段,它無法:
  • 執行早期查找: MSVC 不完全遵守早期查找,因為它推遲了檢查非依賴名稱直到模板實例化。
擴展非ADL查找:

在第二階段,MSVC錯誤地擴展非 ADL 查找以包含在模板定義之後添加的聲明。此行為偏離了標準,該標準僅允許擴展 ADL 提名的​​命名空間。

損壞查找的後果

int foo(void*);

template<typename T> struct S {
  S() { int i = foo(0); }
};

void foo(int);

int main() {
  S<int> s;
}
登入後複製

兩階段的有缺陷的實現MSVC 中的查找可能會導致模板實例化期間出現錯誤。例如,考慮以下程式碼:

在此範例中,符合標準的編譯器將執行早期查找並在建構函式中將「foo(0)」綁定到「foo(void*) 」。然而,MSVC 會推遲查找直到實例化,從而由於 'foo' 的不明確重載而導致編譯錯誤。

結論

雖然 MSVC 提供了兩個的基本實現-階段模板查找,它沒有達到標準的預期。不完整的早期查找和非 ADL 查找的不正確擴展可能會引入錯誤並限制模板在基於 MSVC 的專案中的可用性。了解這些限制對於在此環境中有效處理基於模板的程式碼至關重要。

以上是Microsoft Visual C 的兩階段範本尋找與標準有何不同,後果是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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