Вопрос про ссылочный тип возвращаемого значения

Рейтинг: 1Ответов: 1Опубликовано: 18.02.2023
  1. Не очень понимаю, что значит возвращаем ссылку на элемент, ведь b типа int, а чтобы была ссылка на него=возвр типу, это что ли создается переменная типа int& = b, и она возвращается? Понятно, что мы вернули значение b в return, а потом на } значение стерлось из памяти, но почему при этом в x мусор, если уже успели его инициализировать?
int& foo() {
    int b = 0;
    return b;
}

int main() {
    int x = foo();
}

В общем, произошла какая-то сильная путаница с ссылками

Ответы

▲ 1

Вот как это выглядит в VC++ 2022 при компиляции с отключенной оптимизацией (с включенной foo() вообще выбрасывается:

; 17   : int& foo() {
    push    ebp
    mov ebp, esp
    push    ecx
; 18   :     int b = 0;
    mov DWORD PTR _b$[ebp], 0
; 19   :     return b;
    lea eax, DWORD PTR _b$[ebp]

Т.е. в регистр eax записывается адрес переменной b.

Затем в main()

; 23   :     int x = foo();
    call    ?foo@@YAAEAHXZ              ; foo
    mov eax, DWORD PTR [rax]
    mov DWORD PTR x$[rsp], eax

после выхода из foo() (читай — после уничтожения переменной b) значение по этому адресу записывается в переменную x.