Heim >Backend-Entwicklung >C++ >Warum kann Microsoft Visual C die zweiphasige Vorlageninstanziierung nicht korrekt implementieren?

Warum kann Microsoft Visual C die zweiphasige Vorlageninstanziierung nicht korrekt implementieren?

Linda Hamilton
Linda HamiltonOriginal
2024-12-07 21:56:12205Durchsuche

Why Does Microsoft Visual C   Fail to Correctly Implement Two-Phase Template Instantiation?

Das Geheimnis der „kaputten“ zweiphasigen Vorlageninstanziierung in Microsoft Visual C

Problemstellung:

Benutzer häufig äußern Bedenken, dass Microsoft Visual C (MSVC) Probleme mit der korrekten Implementierung der zweiphasigen Vorlageninstanziierung hat. Welche spezifischen Aspekte des Mechanismus funktionieren nicht wie erwartet?

Hintergrund:

Die zweiphasige Vorlageninstanziierung umfasst eine anfängliche Syntaxprüfung, die MSVC Berichten zufolge durchführt. Es bestehen jedoch Zweifel daran, ob diese Prüfung überprüft, ob in Vorlagen verwendete Namen ordnungsgemäß deklariert werden.

Erklärung:

Tatsächlich ist der Umfang der anfänglichen Syntaxprüfung von MSVC begrenzt. Es kann nicht überprüft werden, ob deklarierte Namen vorhanden sind, was zu Kompilierungsproblemen führt, wenn Namen keine ordnungsgemäßen Deklarationen aufweisen.

Um dies zu veranschaulichen, betrachten Sie das folgende Beispiel:

int foo(void*);

template<typename T> struct S {
  S() { int i = foo(0); }
};

void foo(int);

int main() {
  S<int> s;
}

Ein standardkonformer Compiler würde den Aufruf von foo(0) während der ersten Phase auflösen und an foo(void*) binden. Allerdings verschiebt MSVC diesen Prozess auf die zweite Phase, wodurch foo(0) fälschlicherweise an foo(int) gebunden wird und ein Fehler auftritt.

Darüber hinaus weicht die Implementierung der zweiten Phase durch MSVC in zweierlei Hinsicht von der Sprachspezifikation ab :

  1. Es erweitert die Nicht-ADL-Suche um Deklarationen, die während der zweiten Phase gesammelt wurden.
  2. Es ist falsch löst abhängige Ausdrücke wie bar(t) im folgenden Code in Deklarationen auf, die nur während der zweiten Phase sichtbar sind.
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(&amp;s);
}

In beiden Fällen verstößt das Verhalten von MSVC gegen die angegebene Trennung zwischen den erste und zweite Phase der Template-Instanziierung. Diese falsche Implementierung bleibt in Visual Studio 2015 bestehen.

Das obige ist der detaillierte Inhalt vonWarum kann Microsoft Visual C die zweiphasige Vorlageninstanziierung nicht korrekt implementieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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