簡介
Microsoft Visual C ( MSVC) )經常因其所謂的兩階段模板實例化的有缺陷的實現而受到批評。本文深入探討了這項批評的具體細節,研究了根本問題並提供了詳細的解釋。
兩階段模板實例化爭議
兩階段模板實例化是C 中的一個過程,其中首先從語法上檢查模板類別和函數的正確性,然後在以後的使用站點上進行完整的實例化。然而,有人聲稱 MSVC 沒有正確實現此機制。
對問題的早期理解
最初,人們認為 MSVC 只執行基本的語法檢查在模板定義上,忽略模板中使用的名稱是否已聲明。然而,這種理解並不完整。
問題的本質
MSVC 兩階段模板實例化的實際問題包括兩個互連的層:
第1 層:不正確的第一階段查找
MSVC無法對非依賴表達式執行早期(第一階段)查找,例如範例中:
int foo(void*); template<typename T> struct S { S() { int i = foo(0); } }; void foo(int);
MSVC 將此查找推遲到第二階段,它錯誤地將表達式綁定到「foo( int)”,從而導致錯誤。
圖層2:第二階段查找不正確
MSVC 中模板查找的第二階段也存在缺陷。雖然 C 標準指定在第二階段擴展 ADL 命名的命名空間,但 MSVC 也錯誤地擴展了非 ADL 查找。
這可以透過以下範例來說明:
namespace N { struct S {}; } void bar(void *) {} template <typename T> void foo(T *t) { bar(t); } void bar(N::S *s) {}
儘管存在依賴性,但對bar(t) 的呼叫被錯誤地解析為void bar(N::S *s ),這顯示了MSVC第二階段的不正確行為
結論
Microsoft Visual C 的兩階段範本實例化實作確實有缺陷,但不是最初理解的簡單方式。該問題是不正確的第一階段和第二階段查找之間的複雜相互作用,可能會導致某些程式碼結構出現錯誤或不正確的行為。
以上是Microsoft Visual C 的兩階段範本實例化真的被破壞了嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!