Zwei-Phasen-Vorlageninstanziierung in Microsoft Visual C: Was ist das Problem?
Microsoft Visual C (MSVC) wurde wegen seiner angeblichen Falsche Implementierung der zweiphasigen Vorlageninstanziierung. Diese im C-Standard definierte Methodik besteht aus zwei unterschiedlichen Phasen:
Erste Phase:
Zweite Phase:
Mängel von MSVC:
Das Hauptproblem von MSVC liegt darin, dass es nicht in der Lage ist, eine frühzeitige (erste Phase) Suche nach nicht abhängigen Ausdrücken durchzuführen. Stattdessen werden alle Suchvorgänge auf die zweite Phase verschoben, was zu fehlerhaftem Verhalten führt. Darüber hinaus berücksichtigt die zweite Phase von MSVC die Spezifikation für die Nicht-ADL-Suche nicht korrekt, die in dieser Phase nicht erweitert werden sollte.
Beispiel:
Beachten Sie den folgenden Code :
int foo(void*); template<typename T> struct S { S() { int i = foo(0); } }; void foo(int); int main() { S<int> s; }
Ein standardkonformer Compiler sollte den Aufruf „foo(0)“ währenddessen an „foo(void*)“ binden die erste Phase. MSVC bindet es jedoch während der zweiten Phase fälschlicherweise an „foo(int)“, was zu einem Fehler während der Initialisierung führt.
Zusätzliche Ebene der Fehlerhaftigkeit:
Auch während In der zweiten Phase hält sich MSVC nicht an die Normvorgabe, dass die Nicht-ADL-Suche nicht erweitert werden sollte. Dies führt zur Einbeziehung von Deklarationen, die in der ersten Phase nicht verfügbar waren, was zu unerwartetem Verhalten führt.
Beispiel:
namespace N { struct S {}; } void bar(void *) {} template <typename T> void foo(T *t) { bar(t); } void bar(N::S *s) {} int main() { N::S s; foo(&s); }
Hier ist 'bar(t )“ sollte sich in „void bar(void )“ auflösen, obwohl es in der zweiten Phase aufgelöst wurde. MSVC löst es jedoch fälschlicherweise in „void bar(N::S s)“ auf, was die fehlerhafte Implementierung demonstriert.
Schlussfolgerung:
MSVCs zwei- Die Implementierung der Phasenvorlagen-Instanziierung hält sich nicht vollständig an den C-Standard, was zu fehlerhaftem Verhalten beim Umgang mit nicht abhängigen Ausdrücken und Nicht-ADL-Suchen führt. Diese Mängel können zu unerwarteten Fehlern bei der Kompilierung und Programmverhalten führen.
Das obige ist der detaillierte Inhalt vonWarum weicht die zweiphasige Template-Instanziierung von MSVC vom C-Standard ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!