12

Ainsi, la norme C++ exige que les membres de classe soient initialisés dans l'ordre dans lequel ils sont déclarés dans la classe plutôt que dans l'ordre dans lequel ils sont mentionnés dans la liste d'initialisation du constructeur. Cependant, cela n'implique rien dans l'ordre dans lequel les arguments de ces initialisations sont évalués. Je travaille avec un système qui passe fréquemment des références aux objets de sérialisation, et je me demande si je peux m'assurer que les bits sont lus dans le bon ordre, indépendamment de l'ordre dans lequel ces bits sont écrits dans les champs de l'objet.Liste d'initialisation * argument * ordre d'évaluation

struct Foo { 
    int a; 
    double b; 
    // I want to be able to do this 
    Foo(SerObj &s) 
    : b(s.readDouble()), a(s.readInt()) 
    { } 
    // Rather than this 
    Foo (SerObj &s) 
    { 
     b = s.readDouble(); 
     a = s.readInt(); 
    } 
}; 

De toute évidence, les choses comme réordonnancement ints et doubles dans la déclaration est pas trop gros problème, mais plus gros objets et les choses qui nécessitent une allocation dynamique peut parfois être.

+0

J'ai d'abord manqué que les commandes sont différentes, hehe :) –

Répondre

21

C++ standard 12.6.2/3:

Il y a un point d'ordre (1,9) après l'initialisation de chaque base et l'élément. La liste d'expression d'un mem-initializer est évaluée dans le cadre de l'initialisation de la base ou du membre correspondant.

L'ordre d'initialisation est celui que vous avez spécifié dans la question. L'évaluation fait partie de cette initialisation, et les initialisations ne peuvent pas s'entrelacer (car il y a un point de séquence entre elles). Cela signifie que les appels de fonction dans vos listes d'initialisation ne sont pas appelés dans l'ordre souhaité, mais dans l'ordre dans lequel les déclarations de membre apparaissent.

+0

Pourriez-vous s'il vous plaît ajouter un lien vers la source? Merci. –

+0

Désolé si j'ai mal lu, mais n'était pas la question sur l'ordre d'évaluation des arguments aux constructeurs membres dans leur initialisation respective? Qui devrait être indéfini? –

+0

Hm, probablement pas comme il n'y a qu'un seul argument respectivement. –