Al fine di arginare l'argomento in corso nei commenti di an answer I gave recently, vorrei delle risposte costruttive alle seguenti domande:La durata di un riferimento per quanto riguarda il suo obiettivo
- È la vita di un riferimento distinta dall'oggetto a cui si riferisce? È un riferimento semplicemente un alias per il suo target?
- Un riferimento può sopravvivere al suo obiettivo in un programma ben formato senza comportare un comportamento indefinito?
- È possibile fare riferimento a un nuovo oggetto se la memoria allocata per l'oggetto originale viene riutilizzata?
- Il seguente codice mostra i punti precedenti senza richiamare un comportamento non definito?
codice di esempio da Ben Voigt e semplificato (eseguirlo sul ideone.com):
#include <iostream>
#include <new>
struct something
{
int i;
};
int main(void)
{
char buffer[sizeof (something) + 40];
something* p = new (buffer) something;
p->i = 11;
int& outlives = p->i;
std::cout << outlives << "\n";
p->~something(); // p->i dies with its parent object
new (p) char[40]; // memory is reused, lifetime of *p (and p->i) is so done
new (&outlives) int(13);
std::cout << outlives << "\n"; // but reference is still alive and well
// and useful, because strict aliasing was respected
}
Questo è un sacco di domande, ognuna delle quali richiede una serie di citazioni di parole standard per rispondere correttamente (data la natura della domanda, penso che ci si aspetta che le virgolette standard siano risposte appropriate). È/potrebbe/essere più utile se dovessimo concentrarci su uno di essi e, se utile in quel contesto, rispondere solo agli altri ... – PlasmaHH
Sono d'accordo. Per favore, una domanda per domanda. E scoprirai che le sottoquestioni hanno ricevuto risposta prima. –
Inoltre, quell'esempio di codice ha fatto troppo. Fai un piccolo testcase. –