Question :
Considérez le code suivant :
<code class="cpp">class Bar { public: static const int kConst = 1; void func() { foo(kConst); } }; int main() { Bar b; b.func(); }</code>
Lors de la compilation de ce code, une erreur se produit : "Référence non définie à 'Bar::kConst'". Pourquoi cela se produit-il et comment peut-il être résolu ?
Réponse :
Cette erreur se produit car les membres static const int, s'ils sont utilisés (passés aux fonctions ou cast) , doit être défini dans une portée d'espace de noms.
Selon la section 9.4.2/4 de C 11 :
"Si une donnée membre statique est de type const intégral ou const énumération, sa déclaration dans la définition de classe peut spécifier un initialiseur de constante qui doit être une expression constante intégrale. Dans ce cas, le membre peut apparaître dans des expressions constantes intégrales. Le membre doit toujours être défini dans une portée d'espace de noms s'il est utilisé dans le programme. 🎜>
Le passage du membre de données statique par référence const constitue une "utilisation" selon C 11 section 3.2/2 :"Une expression est potentiellement évaluée sauf si ... est l'opérande de l'opérateur sizeof, ... ou est l'opérande de l'opérateur typeid et ... ne désigne pas une lvalue de type classe polymorphe. Un objet ou une fonction non surchargée est utilisé si son nom apparaît dans une expression potentiellement évaluée."Cependant, GCC autorisait initialement le passage de membres const statiques par référence const sans les définir dans une portée d'espace de noms. Dans les brouillons C 0x, cela n'est plus autorisé.Un problème pratique survient lors de la prise d'adresses ou de références à des objets inexistants comme les membres const statiques. Cela pourrait conduire à un comportement indéfini s'ils sont appelés à partir de plusieurs unités de traduction.Pour résoudre ce problème, les modifications suivantes peuvent être apportées :<code class="cpp">int bar::kConst = 1;</code>
<code class="cpp">foo(static_cast<int>(kConst));</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!