La façon de traiter avec global-constructeur d'avertissement dans clang?

Clang avertit (lors de l'utilisation de -Weverything ou Wglobal-constructors) sur les constructeurs pour les objets statiques.

warning: declaration requires a global constructor
      [-Wglobal-constructors]
A A::my_A; //triggers said warning
     ^~~~

Pourquoi est-ce pertinent et comment doit-on traiter cet avertissement?

Exemple Simple de code:

class A {
  //...
  static A my_A;
  A();
};

A A::my_A; //triggers said warning
  • Peut-on voir l'avertissement, s'il vous plaît?
  • est-ce dans un .h fichier?
  • Vous avez un objet de l'Une à l'intérieur de la classe A. Comment cela fonctionne? N'est-il pas devenu récursive - même si l'objet est statique. Si il ya un seul my_A & le ressemble ne causera pas de problèmes, je ne peux toujours faire A a; & puis un.mY_A.my_A.my_A.my_A etc.
  • Pas de. C'est static. Il est déclaré dans class A, mais il ne réside pas dans chaque class A.
  • Ce programme compile struct A { static A s; }; A A::s; int main() { A a; a.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s; } - c'est presque comme un C++ blague. Pourquoi quelqu'un voudrait-il avoir un objet statique à l'intérieur de lui-même?
  • Un static objet fait partie de l' class, ne fait pas partie d'un objet particulier de la classe, c'est à dire pas à l'intérieur de lui-même. Néanmoins, vous pouvez y accéder que si c'est un membre d'un objet: A::s et A().s reportez-vous à la même (et unique) de l'objet (qu'il s'agisse du même type A ou pas). Avoir un static membre du même type est un moyen d'implémenter un singleton.
  • J'ai vu que le modèle parfois utilisé pour créer un ensemble de statique instances avec des valeurs fixes. Sur le plan conceptuel, comme un enum sur les stéroïdes. Généralement, les constructeurs de classe sont privés, ainsi que les exposés de la statique sont disponibles pour l'usage externe.

InformationsquelleAutor Walter | 2013-03-29