12

Tak więc standard C++ wymaga, aby członkowie klasy zostali zainicjowani w kolejności, w której są zadeklarowani w klasie, a nie w kolejności, w jakiej są wymieniani na liście inicjalizacyjnej każdego konstruktora. Nie oznacza to jednak, że kolejność, w jakiej oceniane są argumenty tych inicjacji. Pracuję z systemem, który często przekazuje odniesienia do obiektów serializacyjnych i zastanawiam się, czy mogę zagwarantować, że bity będą odczytywane z niego we właściwej kolejności, niezależnie od kolejności, w jakiej te bity zostaną zapisane w polach obiektu.Lista inicjalizatorów * argument * zamówienie oceny

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

Oczywiście, zmiany porządku rzeczy, jak ints i doubles w deklaracji nie jest zbyt wielkie rzeczy, ale większe przedmioty i rzeczy wymagające dynamicznej alokacji czasami może być.

+0

Po raz pierwszy spudłowałem, że zamówienia są inne, hehe :) –

Odpowiedz

21

C++ standardowe 12.6.2/3:

Jest punktem sekwencja (1,9) po inicjalizacji każdej podstawy i członu. Lista wyrażeń inicjatora pamięci jest oceniana jako część inicjalizacji odpowiedniej bazy lub elementu.

Kolejność inicjowania jest zgodna z kolejnością określoną w pytaniu. Ocena jest częścią tej inicjalizacji, a inicjalizacje nie mogą się wzajemnie przeplatać (ponieważ istnieje między nimi punkt sekwencji).

Oznacza to, że wywołania funkcji na listach inicjalizujących nie są wywoływane w żądanej kolejności, ale w kolejności występowania deklaracji członków.

+0

Czy mógłbyś dodać link do źródła? Dzięki. –

+0

Przepraszam, jeśli źle odczytałem, ale czy nie było pytanie o kolejność oceny argumentów konstruktorów elementów w ich inicjalizacji? Które powinno być niezdefiniowane? –

+0

Hm, prawdopodobnie nie, ponieważ istnieje tylko jeden argument, odpowiednio. –