Angew en ve jaggedSpire en cevaplar mükemmel ve uygulamakc ++ 11. Vec ++ 14. Vec ++ 17.
Ancak c ++ 20, işler biraz değişir ve OP'deki örnek artık derlenmeyecektir:
class C {
C() = default;
};
C p;
auto q = C();
C r{};
auto s = C{};
İki cevabın da işaret ettiği gibi, son iki bildirimin işe yaramasının nedeni C
, bir kümelenme olması ve bunun toplu başlatma olmasıdır. Bununla birlikte, P1008'in bir sonucu olarak ( OP'den çok farklı olmayan motive edici bir örnek kullanarak), C ++ 20'deki toplu değişikliklerin tanımı [dcl.init.aggr] / 1'e :
Bir toplama, bir dizi veya bir sınıftır ([sınıf])
- bir kullanıcı tarafından beyan kalıtsal veya kurucular ([class.ctor]),
- özel veya korumalı, statik olmayan doğrudan veri üyeleri ([class.access]) yok,
- sanal işlev yok ([class.virtual]) ve
- sanal, özel veya korumalı temel sınıflar ([class.mi]) yoktur.
Vurgu benim. Artık gereksinim, kullanıcı tarafından beyan edilen kurucular değildir, oysa eskiden (her iki kullanıcının da cevaplarında alıntı yaptığı ve C ++ 11 , C ++ 14 ve C ++ 17 için geçmişte görülebildiği için ) kullanıcı tarafından sağlanan kurucular yoktur. . İçin varsayılan kurucu C
kullanıcı tarafından bildirilir, ancak kullanıcı tarafından sağlanmamaktadır ve bu nedenle C ++ 20'de bir toplama olmaktan çıkar.
İşte toplu değişikliklerin başka bir açıklayıcı örneği:
class A { protected: A() { }; };
struct B : A { B() = default; };
auto x = B{};
B
temel bir sınıfa sahip olduğu için C ++ 11 veya C ++ 14'te bir toplama değildi. Sonuç olarak, korumalı varsayılan kurucusuna B{}
erişimi olan varsayılan kurucuyu (kullanıcı tarafından bildirilen ancak kullanıcı tarafından sağlanmayan) çağırır A
.
C ++ 17'de, P0017'nin bir sonucu olarak , toplamalar temel sınıflara izin verecek şekilde genişletildi. B
C ++ 17'de bir toplamadır, bu B{}
, alt nesne dahil tüm alt nesneleri başlatması gereken toplu başlatma anlamına gelir A
. Ancak A
varsayılan kurucusu korunduğu için ona erişimimiz yok, bu nedenle bu başlatma kötü biçimlendirilmiş.
C ++ 20'de, B
kullanıcı tarafından bildirilen kurucu nedeniyle, yine bir toplama olmaktan çıkar, bu nedenle B{}
varsayılan kurucuyu çağırmaya geri döner ve bu yine iyi biçimlendirilmiş bir başlatmadır.
C c{};
Hiçbir kurucu çağrılmadığı için toplu başlatma değil mi?