Pertanyaan ini mengacu pada penambahan P0593 ke draft C ++ 20 terbaru .
Ini contoh saya:
#include <cstdlib>
#include <cstdio>
void foo(void *p)
{
if ( std::getchar() == 'i' )
{
*(int *)p = 2;
std::printf("%d\n", *(int *)p);
}
else
{
*(float *)p = 2;
std::printf("%f\n", *(float *)p);
}
}
int main()
{
void *a = std::malloc( sizeof(int) + sizeof(float) );
if ( !a ) return EXIT_FAILURE;
foo(a);
// foo(a); [2]
}
Apakah kode ini didefinisikan dengan baik untuk semua input di bawah konsep terbaru?
Dasar pemikiran yang dinyatakan dalam P0593 membuatnya cukup jelas bahwa tidak memberi komentar [2]
akan menyebabkan perilaku tidak terdefinisi karena pelanggaran aliasing yang ketat, jika dua item input pengguna berbeda. Penciptaan objek implisit seharusnya terjadi hanya sekali, pada titik malloc
; itu tidak dipicu oleh pernyataan penugasan di foo
.
Untuk menjalankan program yang sebenarnya, ada anggota dari set objek implisit yang tidak ditentukan yang akan membuat program didefinisikan dengan baik. Tetapi tidak jelas bagi saya apakah pilihan penciptaan objek implisit yang disebutkan dalam [intro.object] / 10 harus dilakukan ketika hal itu malloc
terjadi; atau apakah keputusan itu dapat "perjalanan waktu".
Masalah yang sama mungkin muncul untuk program yang membaca gumpalan biner menjadi buffer dan kemudian membuat keputusan runtime tentang bagaimana mengaksesnya (mis deserialization; dan header memberitahu kita apakah float atau int akan muncul).