Ordine di valutazione dell'elenco di inizializzazione del costruttore


252

Ho un costruttore che accetta alcuni argomenti. Avevo supposto che fossero state costruite nell'ordine elencato, ma in un caso sembra che fossero state costruite al contrario con conseguente interruzione. Quando ho invertito gli argomenti, il programma ha smesso di interrompersi. Questo è un esempio della sintassi che sto usando. Il fatto è che a_ deve essere inizializzato prima di b_ in questo caso. Potete garantire l'ordine di costruzione?

per esempio

class A
{
  public:
    A(OtherClass o, string x, int y) :
      a_(o), b_(a_, x, y) { }

    OtherClass a_;
    AnotherClass b_;
};

6
Dici che stai chiedendo degli argomenti del costruttore, ma vengono valutati prima di raggiungere il costruttore e vengono valutati in un ordine non specificato, determinato dal compilatore. Ma stai davvero chiedendo l'ordine delle liste di inizializzazione, quindi ho cambiato il titolo della domanda per te.
Rob Kennedy,

Risposte:


278

Dipende dall'ordine della dichiarazione delle variabili membro nella classe. Quindi a_sarà il primo, quindi b_sarà il secondo nel tuo esempio.


22
In effetti, i buoni compilatori avviseranno se nella dichiarazione è presente un ordine diverso rispetto all'elenco degli inizializzatori del costruttore. Ad esempio, vedi -Wreorderin gcc.
Greg Hewgill il

236
Il motivo per cui sono costruiti nell'ordine di dichiarazione dei membri e non nell'ordine nel costruttore è che uno può avere più costruttori, ma esiste un solo distruttore. E il distruttore distrugge i membri nell'ordine inverso della costruzione.
AProgrammer,

3
volevamo dire ... ordine inverso di dichiarazione. Non di "costruzione", il distruttore non può vedere nel costruttore per sapere che può?
Conrad B,

196

Per citare lo standard, per chiarimenti:

12.6.2.5

L'inizializzazione deve procedere nel seguente ordine:

...

  • Quindi, i membri di dati non statici devono essere inizializzati nell'ordine in cui sono stati dichiarati nella definizione della classe (di nuovo indipendentemente dall'ordine degli inizializzatori mem).

...


18

Il riferimento standard per questo sembra ora essere 12.6.2 sezione 13.3:

(13.3) - Quindi, i membri di dati non statici vengono inizializzati nell'ordine in cui sono stati dichiarati nella definizione della classe (di nuovo indipendentemente dall'ordine degli inizializzatori mem).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.