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 ?

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 ?

Linda Hamilton
Libérer: 2024-10-29 19:02:02
original
769 Les gens l'ont consulté

Why Does Passing a Static Const Int by Reference Cause an

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
   }
};
Copier après la connexion

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));
Copier après la connexion

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!

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