передача указателя ссылки / передача ссылки - PullRequest
2 голосов
/ 02 октября 2011

Получу ли я обычный указатель, когда передаю указатель на ссылку на переменную, или я получаю указатель на ссылку? И что я получу, когда передам ссылку на ссылку? Я использую в классе реализацию стека стандартной библиотеки , и я хочу иметь несколько методов-оболочек для предотвращения несанкционированного доступа к стеку, но я получаю странные ошибки, которые я сузил до получателя. методы с учетом стека.

Должны ли эти методы возвращать чистую ссылку / указатель на исходную переменную, хранящуюся в стеке?

int& zwei() { return stack.top() };

и

int* eins() { return &stack.top() };

1 Ответ

3 голосов
/ 02 октября 2011

Не существует такого понятия, как «указатель на ссылку».Ссылки являются псевдонимами, и поэтому взятие адреса любого из них даст указатель на один и тот же объект:

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.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...