Например, вместо:
void f(T& t) {
// change ‘t’
}
...
T a;
f(a);
я предпочту передачу по указателю:
void f(T* t) {
// change ‘*t’
}
...
T a;
f(&a);
Мой основной мотив – наглядность в вызывающем коде. Когда я вижу «&» перед аргументом, я точно знаю, что это возвращаемый параметр, и он может измениться после вызова. И мне не надо постоянно помнить, какие именно агрументы у этой функции ссылки, а какие нет.
Конечно тут есть и минусы: корявость текста в вызываемом коде, так как надо таскать за собой «*» или «->». Также неплохо бы проверять указатель на ноль.
А у вас есть предпочтения в этом вопросе?