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();
}
Я знаю, возвращать ссылки на локальные значения плохо. Но, с другой стороны, константная ссылка должна продлевать время жизни временного объекта.
Этот код создает вывод UB. Так что никакого продления жизни.
Почему? Я имею в виду, может ли кто-нибудь объяснить, что происходит пошагово?
Где ошибка в моей цепочке рассуждений?
фу():
А (32)-ктор
возврат А (32)-создается и возвращается константная ссылка на локальный объект
А а = foo (); -a инициализируется foo ()возвращаемое значение, возвращаемое значение выходит за рамки (за пределы выражения )и уничтожается, но a уже инициализировано;
(Но на самом деле деструктор вызывается перед конструктором копирования)
фу _2():
return 6 -временный объект типа A создается неявно, создается константная ссылка на этот объект (, продлевающая его жизнь )и возвращаемая
А а = foo (); -a инициализируется foo ()возвращаемое значение, возвращаемое значение выходит за рамки (за пределы выражения )и уничтожается, но a уже инициализировано;
(Но на самом деле деструктор вызывается перед конструктором копирования)