ссылка - это не что иное, как другое имя объекта.Так что это все одинаково:
std::vector<Child>& ref = p->vec;
std::vector<Child>& vecAlias = ref;
int value = 10;
ref[0].func(value);
vecAlias[0].func(value);
p->vec[0].func(value);
Вы не можете изменить значение ссылки.Неинициализированные ссылки не существуют.Как только он инициализирован, его невозможно изменить.Указатели, с другой стороны, имеют аналогичную цель: они разрешают доступ к одним и тем же данным из разных мест.Вы всегда можете изменить то, на что указывает указатель.Но указатели также более подвержены ошибкам, поскольку могут быть неинициализированы или инициализированы нулем.Поэтому старайтесь придерживаться ссылок, если вам не нужна эта гибкость.