Почему получается успешно возвращать значения из функции по ссылке и по адресу?

Я знаю, что нельзя возвращать ссылки и адреса локальных переменных, потому что эта ссылка или адрес будет указывать на адрес уже уничтожившейся переменной, т.е. - на мусор.

Вопрос: Но почему в таком случае удается возвращать значения таким образом и всё работает как надо?

Пример кода:

#include <iostream>
#include <conio.h>
using namespace std;
int& doubleValue(int a) {
    int value = a * 2;
    return value;
}
int *doubleVal(int a) {
    int value = a * 2;
    return &value;
}
int main() {
    cout << doubleValue(2) << endl;
    int val1 = doubleValue(3);
    cout << val1 << endl;
    int &r1 = doubleValue(5);
    cout << r1 << endl;

    cout << *doubleVal(4) << endl;
    int *val2 = doubleVal(3);
    cout << *val2 << endl;
    int &r2 = *doubleVal(7);

    _getch();
    return 0;
}

Программа верно выводит все значения. Почему?

UPD:
В моей книге был пример с возвратом локального указателя из функции:

struct free_throws {
     int made;
     int attempts;
     double percent;
};
const free_throws & clone(free_throws &ft) {
     free_throws *pt;
     pt = &ft;
     return *pt;
}

Вопрос: можно ли в этом случае вернуть локальную переменную-указатель. если да, то почему?


Ответы (1 шт):

Автор решения: Harry

Неопределенное поведение - оно такое неопределенное....

Понимаете, вы можете перебегать дорогу на красный свет светофора. Можете переходить ее с завязанными глазами и заткнутыми ушами. И у вас это будет отлично получаться... до поры до времени.

И то, что после нескольких переходов вы остались живы и здоровы - является ли основанием говорить, что "на красный переходить можно, я проверял!"?

→ Ссылка