Pada tanggal 15 Juli '17 P0329R4 diterima dic ++ 20standar: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf
Ini membawa dukungan terbatas untukc99Inisialisasi yang Ditunjuk. Batasan ini dijelaskan sebagai berikut oleh C.1.7 [diff.decl] .4, diberikan:
struct A { int x, y; };
struct B { struct A a; };
Inisialisasi yang Ditunjuk berikut ini, yang valid di C, dibatasi di C ++:
struct A a = { .y = 1, .x = 2 }
tidak valid di C ++ karena penunjuk harus muncul dalam urutan deklarasi anggota data
int arr[3] = { [1] = 5 }
tidak valid di C ++ karena inisialisasi yang ditunjuk larik tidak didukung
struct B b = {.a.x = 0}
tidak valid di C ++ karena penunjuk tidak dapat bertingkat
struct A c = {.x = 1, 2}
tidak valid di C ++ karena semua atau tidak satu pun anggota data harus diinisialisasi oleh penunjuk
Untuk c ++ 17dan Boost sebelumnya sebenarnya memiliki dukungan untuk Intializers yang Ditunjuk dan ada banyak proposal untuk menambahkan dukungan kec ++standar, misalnya: n4172 dan Proposal Daryle Walker untuk Menambahkan Penunjukan ke Penginisialisasi . Proposal mengutip implementasic99Penginisialisasi yang Ditunjuk dalam Visual C ++, gcc, dan Clang mengklaim:
Kami yakin perubahan akan relatif mudah diterapkan
Tetapi komite standar berulang kali menolak proposal tersebut , dengan menyatakan:
EWG menemukan berbagai masalah dengan pendekatan yang diusulkan, dan merasa tidak layak untuk mencoba menyelesaikan masalah tersebut, karena telah dicoba berkali-kali dan setiap kali gagal.
Komentar Ben Voigt telah membantu saya melihat masalah yang tidak dapat diatasi dengan pendekatan ini; diberikan:
struct X {
int c;
char a;
float b;
};
Dalam urutan apa fungsi-fungsi ini dipanggil c99: struct X foo = {.a = (char)f(), .b = g(), .c = h()}
? Anehnya, dic99:
Urutan evaluasi subekspresi di penginisialisasi apa pun diurutkan secara tidak pasti [ 1 ]
(Visual C ++, gcc , dan Clang tampaknya memiliki perilaku yang disepakati karena mereka semua akan melakukan panggilan dalam urutan ini :)
h()
f()
g()
Tetapi sifat standar yang tidak dapat ditentukan berarti bahwa jika fungsi-fungsi ini memiliki interaksi apa pun, status program yang dihasilkan juga akan tidak dapat ditentukan, dan kompilator tidak akan memperingatkan Anda : Adakah Cara untuk Memperingatkan tentang Penginisialisasi yang Ditunjuk yang Tidak Beraturan?
c ++ memang memiliki persyaratan daftar penginisialisasi yang ketat 11.6.4 [dcl.init.list] 4:
Dalam daftar penginisialisasi dari daftar braced-init, klausa penginisialisasi, termasuk hasil dari perluasan paket (17.5.3), dievaluasi dalam urutan kemunculannya. Artinya, setiap penghitungan nilai dan efek samping yang terkait dengan klausa penginisialisasi tertentu diurutkan sebelum setiap penghitungan nilai dan efek samping yang terkait dengan klausa penginisialisasi apa pun yang mengikutinya dalam daftar daftar penginisialisasi yang dipisahkan koma.
Begitu c ++ dukungan akan meminta ini untuk dieksekusi dalam urutan:
f()
g()
h()
Memecah kompatibilitas dengan sebelumnya c99implementasi.
Seperti dibahas di atas, masalah ini telah dielakkan oleh batasan pada Penginisialisasi yang Ditunjuk yang diterimac ++ 20. Mereka menyediakan perilaku standar, menjamin urutan eksekusi Penginisialisasi yang Ditunjuk.