Heim > Backend-Entwicklung > C++ > Warum weicht die zweiphasige Template-Instanziierung von MSVC vom C-Standard ab?

Warum weicht die zweiphasige Template-Instanziierung von MSVC vom C-Standard ab?

Linda Hamilton
Freigeben: 2024-12-24 14:06:15
Original
182 Leute haben es durchsucht

Why Does MSVC's Two-Phase Template Instantiation Deviate from the C   Standard?

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:

  • Führt grundlegende Syntax- und Typprüfung durch.
  • Überprüft nicht die Angabe oder Existenz der darin verwendeten nicht abhängigen Namen Vorlagen.

Zweite Phase:

  • Löst nicht abhängige Namen auf und bindet sie an ihre Deklarationen.
  • Erweitert die Namespace-Suche für abhängige Namen mit seit dem ersten akkumulierten Deklarationen 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;
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage