Con el fin de frenar el argumento pasando en los comentarios de an answer I gave recently, me gustaría algunas respuestas constructivas a las siguientes preguntas:La vida útil de una referencia con respecto a su objetivo
- ciclo de vida tiene una referencia distinta del objeto al que se refiere? ¿Es una referencia simplemente un alias para su objetivo?
- ¿Puede una referencia sobrevivir a su objetivo en un programa bien formado sin resultar en un comportamiento indefinido?
- ¿Se puede hacer una referencia para referirse a un nuevo objeto si se reutiliza el almacenamiento asignado para el objeto original?
- ¿El siguiente código demuestra los puntos anteriores sin invocar un comportamiento indefinido?
Código de ejemplo por Ben Voigt y simplificado (ejecutarlo en 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
}
Esta es una gran cantidad de preguntas, cada una de las cuales requiere bastantes citas de redacción estándar para responder correctamente (dada la naturaleza de la pregunta, creo que espera que las citas estándar sean las respuestas correctas). Es/podría/ser más útil si nos concentráramos en uno de ellos, y si es útil en ese contexto solo responderemos a los demás ... – PlasmaHH
Estoy de acuerdo. Por favor, una pregunta por pregunta. Y encontrará que las preguntas han sido respondidas antes. –
Además, esa muestra de código tiene demasiado en marcha. Haga una pequeña caja de prueba. –