Urutan evaluasi inisialisasi daftar konstruktor

252

Saya memiliki konstruktor yang memerlukan beberapa argumen. Saya berasumsi bahwa mereka dibangun dalam urutan yang tercantum, tetapi dalam satu kasus tampaknya mereka dibangun secara terbalik sehingga membatalkan. Ketika saya membalikkan argumen, program berhenti dibatalkan. Ini adalah contoh dari sintaks yang saya gunakan. Masalahnya, a_ perlu diinisialisasi sebelum b_ dalam kasus ini. Bisakah Anda menjamin pesanan konstruksi?

misalnya

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

    OtherClass a_;
    AnotherClass b_;
};
Mat
sumber
6
Anda mengatakan Anda bertanya tentang argumen konstruktor, tetapi mereka dievaluasi sebelum Anda mencapai konstruktor, dan mereka dievaluasi dalam urutan yang ditentukan, ditentukan oleh kompiler. Tetapi Anda benar-benar bertanya tentang urutan daftar inisialisasi, jadi saya telah mengubah judul pertanyaan untuk Anda.
Rob Kennedy

Jawaban:

278

Itu tergantung pada urutan deklarasi variabel anggota di kelas. Jadi a_akan menjadi yang pertama, maka b_akan menjadi yang kedua dalam contoh Anda.

AraK
sumber
22
Bahkan, kompiler yang baik akan memperingatkan jika Anda memiliki urutan berbeda dalam deklarasi versus daftar penginisialisasi konstruktor. Misalnya, lihat -Wreorderdi gcc.
Greg Hewgill
236
Alasan mengapa mereka dibangun dalam urutan deklarasi anggota dan bukan dalam urutan dalam konstruktor adalah bahwa seseorang mungkin memiliki beberapa konstruktor, tetapi hanya ada satu destruktor. Dan destruktor menghancurkan anggota dalam urutan terbalik konstruksi.
Pemrogram
3
maksud kami ... membalikkan urutan deklarasi. Bukan dari "konstruksi", destruktor tidak mungkin melihat ke dalam konstruktor untuk mengetahui bukan?
Conrad B
196

Mengutip standar, untuk klarifikasi:

12.6.2.5

Inisialisasi akan diproses dalam urutan sebagai berikut:

...

  • Kemudian, anggota data yang tidak statis harus diinisialisasi dalam urutan mereka dideklarasikan dalam definisi kelas (sekali lagi terlepas dari urutan mem-inisialisasi).

...

GManNickG
sumber
18

The acuan standar untuk ini sekarang tampaknya menjadi 12.6.2 bagian 13.3:

(13.3) - Kemudian, anggota data non-statis diinisialisasi dalam urutan mereka dideklarasikan dalam definisi kelas (lagi terlepas dari urutan mem-inisialisasi).

Adam Getchell
sumber