Références à des types incomplets

Selon la norme C ++ 03, est-il valide d’avoir des références à des types incomplets? Je ne suis au courant d’aucune implémentation qui implémente des références comme des pointeurs autres que des pointeurs non nuls. Ce code devrait donc fonctionner. Cependant, je me demande si les références à des types incomplets sont conformes à la norme.

J’apprécierais les réponses avec des citations et des références à la norme C ++.

Pour autant que je sache, la norme C ++ ne dit pas explicitement que vous pouvez faire référence à un type incomplet. Mais la norme comporte une section qui spécifie quand un type doit être complet:

3.2 Une règle de définition [basic.def.odr]

4. Une seule définition de classe est requirejse dans une unité de traduction si la classe est utilisée de manière à exiger que le type de classe soit complet. [ Exemple: l’unité de traduction complète suivante est bien formée, même si elle ne définit jamais X :

  struct X; // declare X as a struct type struct X* x1; // use X in pointer formation X* x2; // use X in pointer formation 

—End example ] [ Remarque: les règles pour les déclarations et les expressions décrivent les contextes dans lesquels des types de classe complets sont requirejs. Un type de classe T doit être complet si:

  • un object de type T est défini (3.1, 5.3.4), ou
  • une conversion de valeur en valeur est appliquée à une valeur en référence à un object de type T (4.1), ou
  • une expression est convertie (implicitement ou explicitement) en type T (article 4, 5.2.3, 5.2.7, 5.2.9, 5.4) ou
  • une expression qui n’est pas une constante de pointeur null et dont le type est autre que void * est convertie en pointeur de type sur T ou en référence à T aide d’une conversion implicite (clause 4), d’un dynamic_cast (5.2.7) ou d’un static_cast .9), ou
  • un opérateur d’access de membre de classe est appliqué à une expression de type T (5.2.5), ou
  • l’opérateur typeid (5.2.8) ou l’opérateur sizeof (5.3.3) est appliqué à un opérande de type T , ou
  • une fonction avec un type de retour ou un type d’argument de type T est définie (3.1) ou appelée (5.2.2), ou
  • une lvalue de type T est affectée à (5.17). ]

Il semble que dans tous les autres cas, y compris les déclarations de références à des types incomplets, le type puisse être incomplet.

§15.1.3 dit

Le type de l’expression-projection ne doit pas être un type incomplet, ni un pointeur ou une référence à un type incomplet, autre que void *, const void *, volatile void * ou const volatil vide *.

Ce qui semble impliquer que vous puissiez avoir une référence à un type incomplet.

Je ne suis pas encore assez bon pour interpréter la norme, alors prenez ce que vous voulez.