"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi Microsoft Visual C ++ ne parvient pas à implémenter correctement l'instanciation du modèle biphasé?

Pourquoi Microsoft Visual C ++ ne parvient pas à implémenter correctement l'instanciation du modèle biphasé?

Publié le 2025-04-09
Parcourir:110

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

Le mystère de l'instanciation du modèle deux phases "Broken" dans Microsoft Visual C

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*);

template struct 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:

  1. phase.
  2. il résout incorrectement les expressions dépendantes, telles que Bar (t) dans le code ci-dessous, aux déclarations qui ne sont visibles que pendant la deuxième phase.
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.

Dernier tutoriel Plus>

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