簡介
兩階段模板實例化,也稱為簡介
兩階段模板實例化,也稱為早期和晚期查找是C 模板編程的一個重要方面。然而,微軟對該功能的 Visual C (MSVC) 實現因據稱不充分而面臨審查。
理論中的兩階段查找
在標準 C 編譯器中,兩階段查找適用於模板函數和類別。在第一階段,編譯器執行語法檢查,識別具有適當名稱的聲明。實際的名稱查找和綁定會推遲到第二階段,也就是在模板實例化期間發生的事情。
MSVC 的有限實現
在第二階段,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中文網其他相關文章!