Переписано для наглядности:
Ссылки - это замаскированные указатели с добавленным синтаксическим сахаром. У указателей есть множество проблем с производительностью и эффективностью. Псевдоним является одним из ярких примеров. Компилятор не может гарантировать, что память под указателем или ссылкой такая же, как и в прошлый раз, когда он его читал, потому что любой старый указатель может пройти и изменить его. При каждом использовании компилятор вынужден перечитывать значение из памяти, а не кэшировать его в памяти.
На большинстве процессоров регистры работают быстро, доступ к памяти - нет. Поэтому мы никогда не хотим получать доступ к памяти, если мы можем избежать этого. Примитивные типы (int, float и т. Д.) Часто входят в регистры. Компилятор полностью контролирует, какие данные находятся в каждом регистре, и может гарантировать, что ничто не будет перезаписывать значение, поэтому переменные примитивных типов могут потенциально оставаться в регистрах в течение длительного времени, пока компилятору не потребуется записывать какие-либо изменения обратно в память.
Таким образом, при работе с примитивными типами часто менее эффективно использовать ссылку. Он запрещает компилятору кэшировать значение в регистре, вставляет скрытые разыменования и может открыть для вас проблемы с производительностью, возникающие из-за псевдонимов.
Возможно, эффективность в данном случае не важна для вас, но вы сказали, что не могли придумать вескую причину, чтобы не использовать ссылку, кроме как сохранять типизацию. Я утверждаю, что есть очень веская причина.
На мой взгляд, наилучшей практикой будет использование ссылок в первую очередь для агрегатных типов. Компилятор не может передать их в одном регистре, поэтому относительная стоимость использования ссылки будет сильно снижена. Если рассматриваемый тип является примитивным, я всегда предпочел бы работать с копией значения, а не со ссылкой.