15 Temmuz ' 17'de P0329R4 ,c ++ 20standart: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0329r4.pdf
Bu, aşağıdakiler için sınırlı destek sağlar:c99Atanmış Başlatıcılar. Bu sınırlama C.1.7 [diff.decl] .4 ile aşağıdaki şekilde açıklanmıştır:
struct A { int x, y; };
struct B { struct A a; };
C'de geçerli olan aşağıdaki Belirlenmiş Başlatma C ++ 'da kısıtlanmıştır:
struct A a = { .y = 1, .x = 2 }
C ++ 'da geçersizdir çünkü göstericiler veri üyelerinin bildirim sırasında görünmelidir
int arr[3] = { [1] = 5 }
C ++ 'da geçersiz çünkü dizi atanmış başlatma desteklenmiyor
struct B b = {.a.x = 0}
C ++ 'da geçersizdir çünkü göstericiler yuvalanamaz
struct A c = {.x = 1, 2}
C ++ 'da geçersizdir çünkü veri üyelerinin tümü veya hiçbiri belirteçler tarafından başlatılmalıdır
İçin c ++ 17ve daha önceki Boost , Atanmış Başlatıcılar için desteğe sahipti ve destek eklemek için çok sayıda teklif vardı.c ++standart, örneğin: n4172 ve Daryle Walker'ın Başlatıcılara Atama Ekleme Önerisi . Öneriler,c99Visual C ++, gcc ve Clang'daki Belirlenmiş Başlatıcılar şunları iddia ediyor:
Değişikliklerin uygulanmasının nispeten kolay olacağına inanıyoruz
Ancak standart komite , bu tür önerileri defalarca reddederek şunları ifade eder:
EWG, önerilen yaklaşımla ilgili çeşitli sorunlar buldu ve birçok kez denendiği ve her başarısız olduğu için sorunu çözmeye çalışmanın mümkün olduğunu düşünmedi.
Ben Voigt'in yorumları , bu yaklaşımla ilgili aşılmaz sorunları görmeme yardımcı oldu; verilen:
struct X {
int c;
char a;
float b;
};
Bu işlevler hangi sırayla çağrılırdı? c99: struct X foo = {.a = (char)f(), .b = g(), .c = h()}
? Şaşırtıcı bir şekildec99:
Herhangi bir başlatıcıdaki alt ifadelerin değerlendirme sırası belirsiz bir şekilde sıralanır [ 1 ]
(Visual C ++, gcc ve Clang, çağrıları bu sırayla yapacakları için üzerinde anlaşmaya varılmış bir davranışa sahip görünüyor :)
h()
f()
g()
Ancak standardın belirsiz doğası, bu işlevlerin herhangi bir etkileşimi olsaydı, sonuçta ortaya çıkan program durumunun da belirsiz olacağı ve derleyicinin sizi uyarmayacağı anlamına gelir : Hatalı Çalışma Belirlenmiş Başlatıcılar Hakkında Uyarılmanın Bir Yolu Var mı?
c ++ gelmez sıkı başlatıcı listesi gereksinimleri 11.6.4 [dcl.init.list] 4:
Ayraçlı bir init listesinin başlatıcı listesi içinde, paket genişletmelerinden (17.5.3) kaynaklananlar da dahil olmak üzere başlatıcı yan tümceleri göründükleri sırayla değerlendirilir. Yani, belirli bir başlatıcı cümlesiyle ilişkili her değer hesaplaması ve yan etki, her değer hesaplamasından ve başlatıcı listesinin virgülle ayrılmış listesinde onu izleyen herhangi bir başlatıcı cümlesiyle ilişkili yan etkiden önce sıralanır.
Yani c ++ destek, bunun sırayla yürütülmesini gerektirecekti:
f()
g()
h()
Önceki ile son derece uyumluluk c99uygulamalar.
Yukarıda tartışıldığı gibi, bu sorun, kabul edilen Atanan Başlatıcılar üzerindeki sınırlamalarla aşılmıştır.c ++ 20. Atanmış Başlatıcıların yürütme sırasını garanti eden standart bir davranış sağlarlar.