2013-07-03 25 views
5

Tüm sınıf/yapı veri üyeleriniz başlatıcı içermiyorsa, nesneyi oluşturmak için tekdüzen başlatma sözdizimini kullanabilirsiniz.Statik olmayan veri üyesi başlatıcılar neden tekdüzen başlatma sözdizimini bozuyor?

struct foo 
{ 
    int i; 
    float f; 
}; 
... 
foo bar{ 5, 3.141f }; 

Ancak, bir veya daha fazla üyenin başlatıcıları varsa, tekdüze başlatma sözdizimi geçersiz olur.

struct foo 
{ 
    int i; 
    float f = 0; 
}; 
... 
foo bar{ 5, 3.141f }; // Compiler error. 

bir veri üyesi başlatıcısı eklenmesi otomatik olarak bir veya daha fazla varsayılan Kurucular uygular ve initialization_list yapıcı varsayılan uygulama bastırır tahmin. Bu amaçlanan standart mı? Neden bu şekilde çalışıyor?

+8

"initializer_list" yapıcısının varsayılan uygulaması yok ". İlk snippet'te sahip olduğunuza * toplu başlatma işlemi * denir. – Xeo

+1

@ Xeo'nun yorumunu tamamlamak için, bkz. * 8.5.1 [dcl.init.aggr] * ve * 8.5.4 [dcl.init.list] *. – syam

+1

İlgili: http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special/7189821#7189821 –

cevap

1

Evet, bu standart tarafından tasarlanmıştır. Burada çalıştığınız, topal başlatma. Ne yazık ki, ikinci foo, f'un eşit başlatıcısı nedeniyle artık bir toplam olarak kabul edilmez. Bkz 8.5.1 [dcl.init.aggr] (vurgu benim):

bir agrega kullanıcı tarafından sağlanan kurucular (12.1), bir brace- ile bir dizi ya da bir sınıf (Madde 9) Statik olmayan veri üyeleri için (9.2), özel veya korumalı statik olmayan veri elemanları (Madde 11), temel sınıflar (Madde 10) yok ve sanal işlevler (10.3) için or-eşitlemeden başlatıcılar. Bu belirtilen neden

struct foo 
{ 
    int i; 
    float f = 0; 
    constexpr foo(int i, float f) : i(i), f(f) { } 
}; 
... 
foo bar{ 5, 3.141f }; // now okay 

olarak için: Eğer üye f için eşit başlatıcı Çünkü

, sen sonra sen sözdizimi desteklemek için özel bir kurucu vermeniz gerekecektir standart, hiçbir fikrim yok.

+1

Bir sonraki standart için göz önünde bulundurulduğunu unutmayın. statik olmayan veri üyesi başlatıcılarla bile toplanmaya izin vermek için. – Xeo

İlgili konular