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