首頁 > 後端開發 > C++ > Microsoft Visual C 的兩階段範本實例化真的被破壞了嗎?

Microsoft Visual C 的兩階段範本實例化真的被破壞了嗎?

Linda Hamilton
發布: 2024-12-07 12:13:10
原創
846 人瀏覽過

Is Microsoft Visual C  's Two-Phase Template Instantiation Truly Broken, and If So, How?

Microsoft Visual C 被誤解的“損壞的”兩階段模板實例化

簡介

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中文網其他相關文章!

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