Часто задаваемые вопросы по С++:
"Используйте ссылки, когда сможете, и указатели, когда вам нужно".
Я чувствую, что это не так просто, как указано выше. Причины, по которым ссылки, как правило, лучше для указателей, были хорошо обсуждены. Поэтому я бы предпочел обсудить особые случаи, когда ссылки имеют смысл, но очень необычны и просто не чувствуют себя хорошо:
Для меня наиболее очевидным случаем является их использование в общих структурах данных как дерево или связанный список. Их интерфейсы могут быть реализованы с использованием ссылок и более безопасными, но я не видел единственной реализации, которая использовала бы ссылки, например:
Node *parent = n.parent(); // parent might be unset -> pointer
Node &child = n.child(5); // child is always valid -> reference
Хотя это может показаться привлекательным, это приводит к следующему коду:
if(parent == &child) ... // weird, unusual at least?
Мне интересно, это то, что означает чистый С++?
Каждый раз, когда Ive пытались слепо использовать ссылки везде, где это возможно, Ive сталкивался со всеми подобными несоответствиями и заканчивал указателями смешивания и ссылками различными уродливыми способами.
В заключение, почему оператор new не возвращает ссылку на новый экземпляр вместо указателя в первую очередь? (и выбрасывает в случае ошибки):
Node &n = new Node;
delete &n;
Это абсурдный пример, но разве это не будет то, что было бы "чистым С++"?