Maison >développement back-end >C++ >Pourquoi le passage d'un Static Const Int par référence provoque-t-il une erreur « Référence non définie » en C ?
Référence non définie à Static Const Int : une résolution
Dans un scénario de programmation récent, une erreur de compilation est apparue avec le message "Référence non définie à 'Barre ::kConst'". L'erreur provient de l'extrait de code suivant :
class Bar { public: static const int kConst = 1; void func() { foo(kConst); // Error-prone line } };
L'erreur est survenue car le membre constant statique "kConst" n'était pas défini. En règle générale, le compilateur est censé effectuer la substitution nécessaire au moment de la compilation. Cependant, dans ce cas, la fonction "foo" prend un paramètre "const int &", ce qui amène le compilateur à privilégier une référence plutôt qu'une substitution.
Pour résoudre le problème, la modification suivante peut être utilisée :
foo(static_cast<int>(kConst));
Cette approche oblige le compilateur à créer un "int" temporaire et à lui transmettre une référence, permettant une compilation réussie.
Le comportement observé est intentionnel, comme spécifié dans le standard C ( 9.4.2/4), qui stipule que lorsqu'une donnée membre statique de type intégral constant a un initialiseur constant, elle peut apparaître dans des expressions constantes intégrales. Cependant, il doit toujours être défini dans la portée de l'espace de noms s'il est utilisé dans le programme.
Dans le code donné, passer le membre de données statique par référence constante constitue une "utilisation" selon la norme C (3.2/2). Cela signifie que le compilateur est obligé d'imposer la présence d'une définition pour "kConst".
Bien que GCC puisse parfois ignorer cette exigence dans certains scénarios, il est généralement conseillé de respecter la norme et de s'abstenir d'utiliser des références. vers ou prendre des adresses d'objets inexistants.
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!