Что именно происходит при возврате константной ссылки на локальный объект?

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. Так что никакого продления жизни.

Почему? Я имею в виду, может ли кто-нибудь объяснить, что происходит пошагово?

Где ошибка в моей цепочке рассуждений?

фу():

  1. А (32)-ктор

  2. возврат А (32)-создается и возвращается константная ссылка на локальный объект

  3. А а = foo (); -a инициализируется foo ()возвращаемое значение, возвращаемое значение выходит за рамки (за пределы выражения )и уничтожается, но a уже инициализировано;

(Но на самом деле деструктор вызывается перед конструктором копирования)

фу _2():

  1. return 6 -временный объект типа A создается неявно, создается константная ссылка на этот объект (, продлевающая его жизнь )и возвращаемая

  2. А а = foo (); -a инициализируется foo ()возвращаемое значение, возвращаемое значение выходит за рамки (за пределы выражения )и уничтожается, но a уже инициализировано;

(Но на самом деле деструктор вызывается перед конструктором копирования)

7
задан Wug 31 July 2012 в 19:52
поделиться