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 :
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); }
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!