Функция C++ возвращает действительный объект "по ссылке" после уничтожения

Я использую компилятор Visual Studio 2010, и я пытаюсь понять вывод этой программы.

Код:

#include <iostream>
using namespace std;

class A 
{
public:
    int i;
    A()
    {
        i=0; cout<<"constructing A..\n";
    }
    A(int a): i(a)
    {
        cout<<"constructing A with argument\n";
    }
    A(A& a)
    {
        i=a.i;
        cout<<"copy constructor\n";
    }
    ~A()
    {
        cout<<"destructing a: " << i << endl;
    }
};

A& f(A b)
{
    return A(25);
}

void main()
{
    A m;
    cout << "i = " << f(m).i << endl;
}

Выход:
построение A..
конструктор копирования
построение А с аргументом
разрушая: 25
разрушая: 0
я = 25
разрушая: 0

Насколько я понимаю, A(25) возвращается по ссылке, а затем уничтожается, так почему же он печатает значение i: 'i = 25'?

1 ответ

Программа имеет неопределенное поведение. Тем не менее вывод может быть таким, как вы ожидали, потому что память, занятая неживым объектом, может быть еще не перезаписана.

Другие вопросы по тегам