Это плохая идея вернуть ссылки / указатели на объекты в стеке. Они, вероятно, уничтожаются, когда вы выходите из функции. Попробуйте вернуть его согласно значению:
double foo() {
double x = 9;
double &y = x;
//cout << y << "\n";
return y;
}
Теперь возвращаемое значение скопировано вместо ссылки на объект, который, вероятно, больше не существует.