12

Pertanto, lo standard C++ richiede che i membri della classe vengano inizializzati nell'ordine in cui sono dichiarati nella classe, piuttosto che nell'ordine in cui sono menzionati nell'elenco di inizializzazione di qualsiasi costruttore. Tuttavia, questo non implica nulla sull'ordine in cui vengono valutati gli argomenti a tali inizializzazioni. Sto lavorando con un sistema che passa frequentemente i riferimenti agli oggetti di serializzazione e mi chiedo se posso assicurarmi che i bit vengano letti nell'ordine corretto, indipendentemente dall'ordine in cui quei bit vengono scritti nei campi dell'oggetto.Elenco inizializzatore * argomento * ordine di valutazione

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(); 
    } 
}; 

Ovviamente, le cose di riordino come ints e doubles nella dichiarazione non è un affare troppo grande, ma gli oggetti più grandi e le cose che richiedono l'allocazione dinamica a volte può essere.

+0

Ho perso per la prima volta che gli ordini sono diversi, hehe :) –

risposta

21

C++ standard 12.6.2/3:

C'è un punto sequenza (1.9) dopo l'inizializzazione di ogni base ed elemento. L'elenco di espressioni di un inizializzatore di mem viene valutato come parte dell'inizializzazione della base o del membro corrispondente.

L'ordine di inizializzazione è quello specificato nella domanda. La valutazione è parte di questa inizializzazione e le inizializzazioni non possono essere interlacciate (perché tra loro c'è un punto di sequenza).

Ciò significa che le chiamate di funzione negli elenchi di inizializzatore non vengono chiamate nell'ordine desiderato, ma nell'ordine in cui vengono visualizzate le dichiarazioni membro.

+0

Potresti aggiungere un link alla fonte? Grazie. –

+0

Scusa se ho letto erroneamente, ma non era la domanda sull'ordine di valutazione degli argomenti ai costruttori dei membri nelle rispettive inizializzazioni? Quale dovrebbe essere indefinito? –

+0

Hm, probabilmente non perché c'è solo un argomento rispettivamente. –

Problemi correlati