Supposons que j'ai une classe dont le seul but est de provoquer des effets secondaires causés lors de la construction de ses objets (par exemple, l'enregistrement d'une catégorie avec une usine):
class SideEffectCauser {
public:
SideEffectCauser() { /* code causing side-effects */ }
};
Supposez aussi que j'aimerais avoir un objet de créer de tels effets secondaires une fois pour chacune de plusieurs unités de traduction. Pour chaque unité de traduction, je voudrais être en mesure de simplement mettre un SideEffectCauser
l'objet à l'espace de noms de champ dans la .fichier cpp, par exemple,
SideEffectCauser dummyGlobal;
mais 3.6.2/3 du C++03 standard suggère que cet objet n'a pas besoin d'être construit à moins d'un objet ou d'une fonction dans les .rpc fichier est utilisé, et des articles comme les ce et les discussions en ligne comme les ce suggèrent que de tels objets ne sont parfois pas initialisé.
D'autre part, Est-il possible d'instancier des objets à partir d'une chaîne de caractères contenant leur nom de classe? a une solution qui est revendiquée pour le travail, et je remarque que c'est basé sur l'utilisation d'un objet de type SideEffectCauser
comme une donnée membre statique, non pas comme un mondiale, par exemple,
class Holder {
static SideEffectHolder dummyInClass;
};
SideEffectHolder Holder::dummyInClass;
Les deux dummyGlobal
et dummyInClass
sont non-locale statique, mais regarder de plus près 3.6.2/3 du C++03 standard montre que ce passage ne s'applique qu'à des objets à portée espace de noms. Je ne peux pas vraiment trouver quelque chose dans le C++03 norme qui dit que lorsque la non-locale de la statique à la portée de classe sont dynamiquement initialisé, si 9.4.2/7 suggère que les mêmes règles s'appliquent à eux comme à des non-locale de la statique à la portée espace de noms.
Question 1: En C++03, est-il une raison de croire qu' dummyInClass
est plus susceptible d'être initialisé qu' dummyGlobal
? Ou peut aller non initialisée si aucune des fonctions ou des objets dans la même unité de traduction sont utilisés?
Question 2: Ne rien changer en C++11? Le libellé 3.6.2 et 9.4.2 n'est pas le même que le C++03 versions, mais, de ce que je peux dire, il n'y a pas de différence de comportement spécifié pour les scénarios que je décris ci-dessus.
Question 3: Est-il un moyen fiable pour utiliser les objets d'une classe comme SideEffectHolder
à l'extérieur du corps d'une fonction de la force des effets secondaires de prendre place?