Вопрос про ссылочный тип возвращаемого значения
- Не очень понимаю, что значит возвращаем ссылку на элемент, ведь
bтипаint, а чтобы была ссылка на него=возвр типу, это что ли создается переменная типаint& = b, и она возвращается? Понятно, что мы вернули значениеbвreturn, а потом на}значение стерлось из памяти, но почему при этом вxмусор, если уже успели его инициализировать?
int& foo() {
int b = 0;
return b;
}
int main() {
int x = foo();
}
В общем, произошла какая-то сильная путаница с ссылками
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Вот как это выглядит в 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.