Bu soru, P0593'ün en son C ++ 20 taslağına eklenmesini ifade eder .
İşte benim örnek:
#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]
}
Bu kod, en son taslak kapsamındaki tüm girdiler için iyi tanımlanmış mı?
P0593'te ifade edilen gerekçe [2]
, iki kullanıcı giriş öğesi farklıysa , rahatsız etmenin katı takma ad ihlali nedeniyle tanımlanamayan davranışlara yol açacağını oldukça açık bir şekilde ortaya koymaktadır . Örtük nesne yaratmanın şu noktada sadece bir kez olması gerekiyordu malloc
; içindeki atama ifadesi tarafından tetiklenmez foo
.
Programın herhangi bir gerçek çalıştırması için, programı iyi tanımlanmış yapacak, belirtilmemiş örtük nesneler grubunun bir üyesi vardır. Ancak, [intro.object] / 10'da belirtilen örtük nesne oluşturma seçiminin gerçekleştiğinde yapılması gerekip gerekmediği bana açık değil malloc
; veya kararın "zaman yolculuğu" yapıp yapamayacağı.
Aynı sorun, ikili bir bloğu bir arabelleğe okuyan ve daha sonra ona nasıl erişileceğine ilişkin bir çalışma zamanı kararı veren bir program için de ortaya çıkabilir (örn.