Instruction Problème:
Utilisateurs couramment Exprimez les inquiétudes que Microsoft Visual C (MSVC) a du mal à implémenter correctement l'instanciation de modèle en 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 résultant en une erreur.
En outre, la mise en œuvre par MSVC de la deuxième phase s'écarte de la spécification du langage de deux manières 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); }
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