Maison > développement back-end > C++ > L'instanciation de modèle en deux phases de Microsoft Visual C est-elle vraiment interrompue, et si oui, comment ?

L'instanciation de modèle en deux phases de Microsoft Visual C est-elle vraiment interrompue, et si oui, comment ?

Linda Hamilton
Libérer: 2024-12-07 12:13:10
original
852 Les gens l'ont consulté

Is Microsoft Visual C  's Two-Phase Template Instantiation Truly Broken, and If So, How?

Instanciation de modèle en deux phases « cassée » mal comprise de Microsoft Visual C

Introduction

Microsoft Visual C (MSVC ) a souvent été critiqué pour sa prétendue mise en œuvre défectueuse de l'instanciation de modèle en deux phases. Cet article approfondit les détails de cette critique, examine le problème sous-jacent et fournit une explication détaillée.

La controverse sur l'instanciation de modèle en deux phases

L'instanciation de modèle en deux phases est un processus en C dans lequel les classes et les fonctions de modèles sont d'abord vérifiées syntaxiquement pour vérifier leur exactitude, puis une instanciation complète se produit sur les sites d'utilisation ultérieurs. Cependant, des allégations ont été faites selon lesquelles MSVC n'implémente pas correctement ce mécanisme.

Première compréhension du problème

Au départ, on pensait que MSVC effectuait uniquement des vérifications de syntaxe de base sur les définitions de modèle, en ignorant si les noms utilisés dans le modèle ont été déclarés. Cependant, cette compréhension est incomplète.

La véritable nature du problème

Le problème réel avec l'instanciation de modèle en deux phases de MSVC comprend deux couches interconnectées :

Couche 1 : recherche incorrecte de première phase

MSVC ne parvient pas à s'exécuter recherche précoce (première phase) d'expressions non dépendantes, comme dans l'exemple :

int foo(void*);

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

void foo(int);
Copier après la connexion

MSVC reporte cette recherche à la deuxième phase, où il lie par erreur l'expression à 'foo(int)', entraînant une erreur.

Couche 2 : Recherche incorrecte de la deuxième phase

La deuxième phase de la recherche de modèles dans MSVC est également erronée. Alors que la norme C spécifie que les espaces de noms nommés par ADL sont étendus dans la deuxième phase, MSVC étend également par erreur la recherche non-ADL.

Cela peut être illustré par l'exemple suivant :

namespace N {
  struct S {};
}

void bar(void *) {}

template <typename T> void foo(T *t) {
  bar(t);
}

void bar(N::S *s) {}
Copier après la connexion

Bien qu'il soit dépendant, l'appel à bar(t) est incorrectement résolu en void bar(N::S *s), démontrant le comportement inapproprié de la deuxième phase de MSVC. lookup.

Conclusion

L'implémentation par Microsoft Visual C de l'instanciation de modèle en deux phases est en effet imparfaite, mais pas de la manière simpliste initialement comprise. Le problème est une interaction complexe entre des recherches incorrectes de première et de deuxième phases qui peuvent entraîner des erreurs ou un comportement incorrect pour certaines constructions de code.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal