Alasannya adalah jika kelas tersebut tidak memiliki konstruktor yang ditentukan pengguna, maka kelas tersebut dapat berupa POD, dan kelas POD tidak diinisialisasi secara default. Jadi jika Anda mendeklarasikan objek const POD yang tidak diinisialisasi, apa gunanya? Jadi saya pikir Standar memberlakukan aturan ini sehingga objek tersebut benar-benar dapat berguna.
struct POD
{
int i;
};
POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!
POD p2 = POD(); //initialized
const POD p3 = POD(); //initialized
const POD p4; //uninitialized - error - as we cannot change it later on!
Tetapi jika Anda membuat kelas menjadi non-POD:
struct nonPOD_A
{
nonPOD_A() {} //this makes non-POD
};
nonPOD_A a1; //initialized
const nonPOD_A a2; //initialized
Perhatikan perbedaan antara POD dan non-POD.
Konstruktor yang ditentukan pengguna adalah salah satu cara untuk membuat kelas menjadi non-POD. Ada beberapa cara untuk melakukannya.
struct nonPOD_B
{
virtual void f() {} //virtual function make it non-POD
};
nonPOD_B b1; //initialized
const nonPOD_B b2; //initialized
Perhatikan bahwa nonPOD_B tidak mendefinisikan konstruktor yang ditentukan pengguna. Kompilasi. Ini akan mengkompilasi:
Dan komentari fungsi virtual, maka itu memberikan kesalahan, seperti yang diharapkan:
Nah, saya pikir, Anda salah memahami bagian itu. Ini pertama kali mengatakan ini (§8.5 / 9):
Jika tidak ada penginisialisasi yang ditentukan untuk sebuah objek, dan objek tersebut dari (mungkin memenuhi syarat cv) jenis kelas non-POD (atau lariknya), objek harus diinisialisasi secara default; [...]
Ini berbicara tentang kelas non-POD yang mungkin tipe berkualifikasi cv . Artinya, objek non-POD akan diinisialisasi default jika tidak ada penginisialisasi yang ditentukan. Dan apa yang diinisialisasi default ? Untuk non-POD, spesifikasi mengatakan (§8.5 / 5),
Untuk menginisialisasi default objek tipe T berarti:
- jika T adalah tipe kelas non-POD (klausul 9), konstruktor default untuk T dipanggil (dan inisialisasi tidak berbentuk jika T tidak memiliki konstruktor default yang dapat diakses);
Ini hanya berbicara tentang konstruktor default T, apakah yang ditentukan pengguna atau yang dihasilkan kompiler tidak relevan.
Jika Anda jelas untuk ini, maka pahami apa yang dikatakan spesifikasi selanjutnya ((§8.5 / 9),
[...]; jika objek adalah tipe yang memenuhi syarat const, tipe kelas yang mendasari harus memiliki konstruktor default yang dideklarasikan pengguna.
Jadi teks ini menyiratkan, program akan menjadi tidak benar jika objek adalah tipe POD yang memenuhi syarat const , dan tidak ada penginisialisasi yang ditentukan (karena POD tidak diinisialisasi default):
POD p1; //uninitialized - can be useful - hence allowed
const POD p2; //uninitialized - never useful - hence not allowed - error
Omong-omong, ini mengkompilasi dengan baik , karena non-POD, dan dapat diinisialisasi secara default .
a, tetapi gcc-4.3.4 menerimanya bahkan ketika Anda melakukannya (lihat ideone.com/uHvFS )