Если функция работает без побочных эффектов, то она принимает копии переменных, иначе ссылки на них.
void foo(int i) {a = i; } <=> void foo(const int& i) {a = i;}
В первом случае произойдет создание копии переменной при вызове, во втором, копия будет создана после неявного приведения типа: const int& -> int. Я придерживаюсь второго варианта, потому что он наиболее точней описывает то, что будет происходить с переменной, после передачи ее в функцию, а именно: значение переменной i не будет изменено.