Saya mengalami kesulitan dalam memahami paragraf berikut yang dikutip dari cppreference tentang konstruktor standar sepele. Saya telah mencari stackoverflow tetapi masih belum mendapatkan jawaban yang jelas. Jadi tolong bantu.
Konstruktor default sepele adalah konstruktor yang tidak melakukan tindakan. Semua tipe data yang kompatibel dengan bahasa C (tipe POD) sepele-standar dibangun. Namun, tidak seperti dalam C, objek dengan konstruktor standar sepele tidak dapat dibuat hanya dengan menafsirkan kembali penyimpanan yang selaras, seperti memori yang dialokasikan dengan std :: malloc: penempatan-baru diperlukan untuk secara resmi memperkenalkan objek baru dan menghindari kemungkinan perilaku yang tidak terdefinisi.
Khususnya, jika konstruktor default sepele tidak melakukan apa-apa, mengapa kita tidak bisa menafsirkan kembali penyimpanan dan berpura-pura ada objek dengan tipe yang diberikan? Bisakah Anda memberikan beberapa contoh untuk kemungkinan perilaku tidak terdefinisi yang akan ditimbulkan oleh ini?
sumber
*reinterpret_cast<float*>(&someNonFloatObject) = 0.1f;
. C ++ memiliki konsep objek dan masa hidup objek, yang ditentukan pada mesin abstrak, dan hanya karena tidak ada instruksi CPU untuk membuat objek dari penyimpanan tidak berarti bahwa tidak ada perbedaan pada mesin abstrak.Jawaban:
P0593R5 memberikan contoh ini:
dan menjelaskan:
Dalam praktiknya ini berhasil dan situasi UB dianggap lebih sebagai cacat dalam standar daripada yang lainnya. Seluruh tujuan dari makalah ini adalah untuk mengusulkan cara untuk memperbaiki masalah itu dan kasus-kasus serupa tanpa melanggar hal-hal lain.
sumber
Untuk alasan "murni".
Alternatif dan status quo aktual adalah bahwa setiap wilayah penyimpanan akan berisi semua objek yang cocok dalam penyimpanan itu, pada saat yang sama. Beberapa anggota komite tidak nyaman dengan status quo dan banyak orang takut gagasan memiliki banyak objek di tempat yang sama (dalam keadaan virtual dan tidak diinisialisasi).
Tidak ada yang pernah mampu menunjukkan masalah logika dengan memiliki banyak objek di wilayah penyimpanan yang tak terhingga banyaknya.
Karena mereka memiliki bagian berbeda dari standar yang mengatakan hal-hal yang bertentangan, anggota komite hanya memutuskan untuk menganggap serius salah satu bagian terburuk dari standar.
Juga, menggunakan string literal sangat tidak diperbolehkan, jika Anda benar-benar menganggap serius satu bagian dari standar itu.
sumber
type_info
objek. Sudahkah Anda melaporkan tentang string literal?