struct A {
A(int) : i(new int(783)) {
std::cout << "a ctor" << std::endl;
}
A(const A& other) : i(new int(*(other.i))) {
std::cout << "a copy ctor" << std::endl;
}
~A() {
std::cout << "a dtor" << std::endl;
delete i;
}
void get() {
std::cout << *i << std::endl;
}
private:
int* i;
};
const A& foo() {
return A(32);
}
const A& foo_2() {
return 6;
}
int main()
{
A a = foo();
a.get();
}
Lo sé, devolver las referencias a los valores locales es malo. Pero, por otro lado, la referencia de const debe extender una vida de objeto temporal.¿Qué ocurre exactamente al devolver la referencia const a un objeto local?
Este código produce una salida UB. Entonces no hay extensión de vida.
¿Por qué? Quiero decir, ¿alguien puede explicar qué está pasando paso a paso?
¿Dónde está la falla en mi cadena de razonamiento?
foo():
A (32) - ctor
retorno A (32) - una referencia const a objeto local se crea y se devuelve
A una = foo(); - a se inicializa mediante el valor devuelto foo(), el valor devuelto sale del ámbito (fuera de expresión) y se destruye, pero a ya está inicializado;
(Pero en realidad destructor se llama antes de constructor de copia)
FOO_2():
retorno 6 - temp objeto de tipo A se crea de forma implícita, una referencia constante a este objeto se crea (prolonga su vida útil) y se devuelve
A a = foo(); - a se inicializa mediante el valor devuelto foo(), el valor devuelto sale del ámbito (fuera de expresión) y se destruye, pero a ya está inicializado;
(Pero en realidad destructor se llama antes de constructor de copia)
"la referencia const debe extender la vida útil temporal de un objeto" <- erm, no cuando se trata de las referencias no-const y const de la vida del objeto son iguales y no la extienden * no *. – Giel
Creo que esto es lo que Alexander está hablando en términos de extender la vida útil: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ – vmpstr
@Giel: No. La referencia de Const ** puede ** extender la vida útil del objeto temporal. Las referencias de const y non const son bastante diferentes cuando se trata de trabajar con temporarios. En este caso, simplemente funciona de manera diferente a lo que parece esperar OP. – AnT