Bunun nedeni, sınıfın kullanıcı tanımlı bir kurucusu yoksa, o zaman POD olabilmesi ve POD sınıfının varsayılan olarak başlatılmamasıdır. Öyleyse, başlatılmamış bir POD const nesnesi bildirirseniz, ne işe yarar? Bu yüzden, Standardın bu kuralı uyguladığını ve böylece nesnenin gerçekten faydalı olabileceğini düşünüyorum.
struct POD
{
int i;
};
POD p1;
p1.i = 10;
POD p2 = POD();
const POD p3 = POD();
const POD p4;
Ancak sınıfı POD dışı yaparsanız:
struct nonPOD_A
{
nonPOD_A() {}
};
nonPOD_A a1;
const nonPOD_A a2;
POD ve POD olmayanlar arasındaki farka dikkat edin.
Kullanıcı tanımlı kurucu, sınıfı POD dışı yapmanın bir yoludur. Bunu yapmanın birkaç yolu var.
struct nonPOD_B
{
virtual void f() {}
};
nonPOD_B b1;
const nonPOD_B b2;
NonPOD_B'nin kullanıcı tanımlı kurucuyu tanımlamadığına dikkat edin. Derleyin. Derleyecektir:
Ve sanal işlevi yorumlayın, ardından beklendiği gibi hata veriyor:
Sanırım geçidi yanlış anladın. Önce şunu söylüyor (§8.5 / 9):
Bir nesne için başlatıcı belirtilmemişse ve nesne (muhtemelen cv nitelikli) POD dışı sınıf tipindeyse (veya bunun dizisi), nesne varsayılan olarak başlatılacaktır; [...]
POD olmayan sınıftan muhtemelen cv nitelikli türden bahsediyor . Yani, POD olmayan nesne, herhangi bir başlatıcı belirtilmemişse varsayılan olarak başlatılacaktır. Ve varsayılan olarak başlatılan nedir? POD olmayanlar için spesifikasyon (§8.5 / 5),
T türünde bir nesneyi varsayılan olarak başlatmak şu anlama gelir:
- T, POD olmayan bir sınıf türüyse (madde 9), T için varsayılan kurucu çağrılır (ve T'nin erişilebilir varsayılan kurucusu yoksa başlatma kötü biçimlidir);
Kullanıcı tanımlı veya derleyici tarafından oluşturulmuş olsun, T'nin varsayılan yapıcısından bahseder .
Bunu anladıysanız, sonraki şartnamenin ne dediğini anlayın ((§8.5 / 9),
[...]; nesne const nitelikli türdeyse, temeldeki sınıf türünün kullanıcı tanımlı bir varsayılan kurucusu olmalıdır.
Bu metin ima Yani, programın kötü oluşacak eğer nesne taşımaktadır const nitelikli POD türü ve (POD başlatıldı default olmadığından) hiçbir başlatıcı orada belirtilir:
POD p1;
const POD p2;
Bu arada, bu POD olmadığı için iyi bir şekilde derlenir ve varsayılan olarak başlatılabilir .
a, ancak gcc-4.3.4 bunu yaptığınızda bile kabul ediyor ( ideone.com/uHvFS'ye bakın )