Karena P0593 penciptaan objek secara implisit untuk manipulasi objek tingkat rendah telah diterima, objek sekarang dapat dibuat secara implisit dalam C ++ 20.
Khususnya kata-kata yang diperkenalkan oleh proposal memungkinkan operasi tertentu (seperti std::malloc
) untuk secara otomatis membuat dan memulai masa objek dari tipe tertentu, yang disebut tipe implisit-seumur hidup , jika pengenalan objek tersebut akan menyebabkan program dengan perilaku yang tidak ditentukan untuk memiliki perilaku yang didefinisikan. Lihat [intro.object] / 10 .
Draf sekarang lebih lanjut menyatakan bahwa jika ada beberapa set objek seperti itu yang dapat dibuat secara implisit untuk memberikan perilaku yang ditentukan program, itu tidak ditentukan yang mana dari set ini dibuat. (Kalimat yang relevan tampaknya tidak hadir dalam revisi proposal terakhir yang dapat saya akses, R5, tetapi dalam konsep komit.)
Apakah benar-benar ada program yang dapat diamati pilihan set objek yang dibuat secara implisit ini? Dengan kata lain, apakah ada program dengan perilaku yang ditentukan, tetapi tidak ditentukan, melalui aturan baru ini, sehingga dimungkinkan untuk menyimpulkan dari output yang menetapkan jenis objek implisit (dari lebih dari satu yang mungkin) dibuat?
Atau apakah kalimat ini hanya dimaksudkan untuk memperjelas pelaksanaan program pada mesin abstrak (tanpa dampak yang dapat diamati)?
sumber
std::malloc
), jika tidak, Anda mendapatkan masalah dengan definisi secara rekursif tergantung pada masa depan.Jawaban:
Mari kita ambil contoh dalam standar dan mengubahnya sedikit:
Sebelumnya, hanya ada satu set objek yang valid yang dapat dibuat secara implisit dalam penyimpanan itu - itu harus tepat satu
X
. Tapi sekarang, kami memiliki penyimpanan untuk duaX
s, tetapi hanya menulis ke salah satu dari mereka, dan tidak ada dalam program ini yang pernah menyentuh sisa byte. Jadi ada banyak set objek yang berbeda yang dapat dibuat secara implisit - mungkin duaX
s, mungkin anX
dan duaint
s, mungkin anX
dan delapanchar
s, ...Tidak dapat diamati set mana yang dibuat, karena jika ada pengamatan yang sebenarnya, itu akan mengurangi kemungkinan hanya set yang valid. Jika kita melakukan sesuatu seperti
p[1]->a = 3
itu, maka alam semesta dari kemungkinan runtuh menjadi satu dengan duaX
.Dengan kata lain, beberapa set objek yang dibuat secara implisit hanya mungkin ketika tidak ada pengamatan yang cukup dalam program untuk membedakan validitasnya. Jika ada cara untuk membedakan, maka menurut definisi, semuanya tidak akan valid.
sumber
char
,unsigned char
ataustd::byte
? Objek jenis apa pun yang dapat disalin secara sepele juga bisa ada di sana, kurasa?X
objek.