Per quanto ne so, nessuno di ciò che hai fatto comporta un comportamento indefinito.
Tuttavia, crea immediatamente un rischio di perdita di memoria. Può essere risolto rapidamente (poiché &x
si risolverebbe all'indirizzo della memoria trapelata e può quindi essere eliminato) ma se si dovesse lasciare l'ambito, non si avrebbe alcun modo di recuperare quel puntatore.
Edit: al punto, se si dovesse scrivere
int& x=*new int;
x = 5;
std::cout << x << std::endl;
std::cin >> x;
std::cout << x << std::endl;
Il codice si comporterebbe come se si fosse semplicemente dichiarato x come int x;
, tranne che il puntatore sarebbe anche lasciato in sospeso dopo che il programma è terminato ambito .
Si otterrebbe un comportamento non definito se si tentasse di leggere la variabile non inizializzata prima di assegnargli un valore, ma ciò non sarebbe falso se lo stack x
fosse allocato.
Questo è un codice legittimo e sicuro finché si inizializza 'x' successivamente con qualche valore, piuttosto che consumare la variabile non inizializzata per qualche scopo. La cosa migliore sarebbe 'int & x = * new int()' che lo inizializza anche a zero. E naturalmente devi eliminare la memoria allocata. – Arunmu
Non penso che sia diverso da 'int y; int & x = y; ', che è ciò che accade nel modo in cui si fa' int y; std :: cin >> y; ' – dyp