Il n'y a aucune garantie que l'un des deux est initialisé statiquement avant qu'un code d'exécution ne soit exécuté. Pour la première, il est facile d'y arriver, mais
class One{
public:
int adad1;
int adad2;
};
// initialized statically, if a and b are constant-expressions
One one = { a, b };
Comme dit un autre gars, constexpr
dans C++ 0x permet constructeurs à exécuter de manière statique. Dans votre cas, cela fonctionnerait pour le premier cas, mais pas pour le second. Vous devrez vivre cela pour la seconde, aucune garantie n'est faite par le Standard. Mais le Standard permet toujours une implémentation pour l'optimiser en phase d'initialisation statique. Voir 3.6.2/2
Une mise en œuvre est autorisé à effectuer l'initialisation d'un objet de champ d'espace de noms avec la durée de stockage statique comme une initialisation statique, même si une telle initialisation ne doit être fait de manière statique, à condition que
- la version dynamique de l'initialisation ne modifie pas la valeur de tout autre objet de la portée espace de noms avec la durée de stockage statique avant son initialisation, et
- la version statique de l'initialisation produit la même valeur dans l'objet initialisé comme serait prod par l'initialisation dynamique si tous les objets qui ne doivent pas être initialisés statiquement ont été initialisés dynamiquement.
Si le tableau donné est approprié, votre constructeur ne peut pas violer ces règles. La norme montre un exemple, que j'ai expliqué dans more detail here. Pour l'achèvement, le code exemple ci-dessous
inline double fd() { return 1.0; }
extern double d1;
double d2 = d1; // unspecified:
// may be statically initialized to 0.0 or
// dynamically initialized to 1.0
double d1 = fd(); // may be initialized statically to 1.0
Comme vous le voyez, mettre les choses à initialisées plus tôt peut même aller avec des valeurs initiales modifiées s'il existe une certaine relation entre les variables.
Que voulez-vous dire par "pendant la compilation"? Tous se produisent à l'exécution. Si vous voulez dire "vraiment" au moment de la compilation, vous devez attendre le 'constexpr' qui vient avec C++ 0x. – AraK