Не существует такого понятия, как «указатель на ссылку».Ссылки являются псевдонимами, и поэтому взятие адреса любого из них даст указатель на один и тот же объект:
int a;
int & b = a;
assert(&a == &b);
Ваши функции возвращают действительный результат при условии, что объект stack
все еще жив вобласть действия функции return.
std::stack<int> s;
int & foo() { return s.top(); } // OK, maybe
int * goo() { return &s.top(); } // ditto
int & boo() { std::stack<int> b; return b.top(); } // No! Dangling reference!
Вы также должны проверить, что стек не пуст; в этом случае top()
недопустим.
(Я также должен советовать не вызыватьпеременная с тем же именем, что и тип, даже если имя типа std::stack
.)