Pourquoi ce code ne génère-t-il pas d’erreurs de compilation?

template void foo() { M } 

À moins que je l’instancie, Visual C ++ ne me dit pas que le code ci-dessus contient une ou des erreurs. Pourquoi est-ce?

La norme C ++ contient une description informelle de cette question qui décrit ce que j’estime être une bonne directive et que beaucoup de gens considèrent comme l’exigence normative impliquée par la spécification.

Cependant, les implémentations peuvent indiquer des parties normatives de la norme qui leur permettent d’aller plus loin que ce que les règles “évidentes” semblent énoncer. Je vais décrire cela ci-dessous.

Description non normative

La norme permet à une implémentation de ne pas vérifier les définitions de modèle tant qu’elles ne sont pas instanciées. Cela ne donne pas une description formelle du moment où une “définition de modèle” est en réalité supposée être une définition de modèle, mais l’implémentation habituelle consiste à créer des formes “d’équilibrage d’accolade” / “équilibrage de parens”: le corps de la définition, compte jusqu’à ce que vous frappez la dernière accolade de fermeture. Tout ce qui est entre les deux est ignoré.

Je suppose qu’un exemple tiré de la norme clarifie cela davantage

 template class X { // ... (omitted) ... void g(T t) { +; // may be diagnosed even if X::g is not instantiated } }; 

Le diagnostic précoce des erreurs de syntaxe ou de sémantique dans les définitions de modèle est donc une “qualité d’implémentation”.


Description normative

Ces règles sont de la qualité “pas de diagnostic requirejs”. Il convient de noter que les mises en œuvre de ces règles se voient accorder la licence leur permettant de ne pas diagnostiquer les définitions de modèle mal formées, même si le modèle est instancié , malgré ce que dit la note non normative de la norme. Si une règle pour laquelle aucun diagnostic n’est requirejs est violée, une implémentation est libre de faire ce qu’elle veut avec l’ensemble du programme.

Il convient de noter qu’il n’existe pas non plus de “définition de modèle” syntaxiquement mal formée, car ce terme même est défini par la syntaxe elle-même. Un Lonely + rend tout le contexte englobant comme une soupe de jetons insensés.

Dernier point, mais non le moindre, le comité est au courant de ces “échappatoires”, mais il n’y avait pas de majorité pour changer cela jusqu’à présent, pour autant que je sache.

Parce que Visual C ++ est en erreur. Il ne met pas en œuvre la recherche en deux phases . Il est censé vérifier la syntaxe du modèle, même si vous ne l’instanciez pas, mais cela ne fonctionne pas.

GCC ne l’accepte pas. Ne pas dire que cela signifie nécessairement que ce n’est pas correct, mais vous avez de toute façon un exemple de ce qui est censé se produire.