Instruction Problème:
Les utilisateurs expriment généralement des préoccupations que Microsoft Visual C (MSVC) avec des luttes correctement implémentant les deux phases Quels aspects spécifiques du mécanisme ne fonctionnent pas comme prévu?
arrière-plan:
L'instanciation du modèle en deux phases implique une vérification de syntaxe initiale que MSVC aurait fonctionné. Cependant, des doutes surgissent si cette vérification vérifie si les noms utilisés dans les modèles sont déclarés de manière appropriée.
Explication:
En effet, la vérification initiale de la syntaxe de MSVC est limitée dans la portée. Il ne vérifie pas la présence de noms déclarés, conduisant à des problèmes de compilation lorsque les noms manquent de déclarations appropriées.
pour l'illustrer, considérez l'exemple suivant:
int foo(void*); templatestruct S { S() { int i = foo(0); } }; void foo(int); int main() { S s; }
Un compilateur conforme standard résoudrait l'appel foo (0) pendant la première phase et le lierait à foo (void *). Cependant, MSVC repose ce processus à la deuxième phase, liant mal Foo (0) à Foo (int) et entraînant une erreur.
En outre, l'implémentation de MSVC de la deuxième phase s'écarte de la spécification du langage de deux manières:
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); }
Dans les deux cas, le comportement de MSVC contrevient à la séparation spécifiée entre les première et deuxième phases de l'instanciation du modèle. Cette implémentation incorrecte persiste dans Visual Studio 2015.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3