Возвращает ссылку на объект в стеке, который не существует после возврата из метода - стек свободен, память все еще там, но вы не должны ее использовать
X& fun() {
X s;
return s;
}
Когда вы меняете это на:
X fun() {
X s;
return s;
}
Вы сейчас возвращаете копию. Если компилятор достаточно умен, он может сделать:
X fun() {
return X();
}
В этом случае X
выделяется непосредственно в стеке вызывающих, так что копирование не требуется.
Если это ошибка или нет, зависит от того, обращаетесь ли вы к недействительной памяти.
В вашем примере у вас нет доступа к значениям из структуры. Чтобы увидеть segfault, сначала сохраните ссылку, которую вы вернули с помощью fun()
, добавьте некоторые переменные в структуру X
и после возврата из fun()
вызовите другой метод, который внутренне выделяет часть памяти в стеке (это должно перезаписать исходную память, используемую X
в fun
) и хранит некоторые значения в стеке (предпочтительно 0). После возврата этого второго метода попытайтесь распечатать значения из X
, используя исходную ссылку, возвращенную из fun
...