Questa domanda si riferisce all'aggiunta di P0593 al più recente C 20 progetti ++ .
Ecco il mio esempio:
#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]
}
Questo codice è ben definito per tutti gli input nell'ultima bozza?
La logica espressa in P0593 chiarisce abbastanza chiaramente che il non commento [2]
porterebbe a comportamenti indefiniti a causa di una severa violazione dell'aliasing, se i due elementi di input dell'utente differiscono. La creazione implicita di oggetti dovrebbe avvenire solo una volta, al punto di malloc
; non è attivato dall'istruzione di assegnazione in foo
.
Per qualsiasi esecuzione effettiva del programma, esiste un membro dell'insieme non specificato di oggetti impliciti che renderebbe il programma ben definito. Ma non mi è chiaro se la scelta della creazione implicita di oggetti menzionata in [intro.object] / 10 debba essere fatta quando ciò malloc
accade; o se la decisione può "viaggiare nel tempo".
Lo stesso problema può sorgere per un programma che legge un BLOB binario in un buffer e quindi prende una decisione di runtime su come accedervi (ad es. Deserializzazione; e l'intestazione ci dice se sta arrivando un float o un int).