Мои рассуждения таковы:
Кажется, что лучше скатиться с языка, если вы напишите «const T &», но когда вы сделаете это, вы получите неоднозначную «константную T-ссылку». Я неоднократно сталкивался с этой проблемой в понимании кода, который позволял кому-то, даже немного опытному, неправильно истолковывать, что что-то значит или как объявлять более сложный тип.
Я не могу вспомнить ни одного примера прямо сейчас, но я не раз отвечал на вопросы об объявлениях типов и константности, где проблема была вызвана привычкой использовать «const T &» вместо «T const &». Я тоже так писал, и когда я стал старшим разработчиком, ответственным за наставничество и создание стандартов кода в проектах, я обнаружил, что для разработчиков начального уровня намного проще, когда я заставляю всех использовать «T const &». Полагаю, одна довольно тривиальная ошибка новичка - почему этот код компилируется?
<code>
const T* t = f();
t = 0; // assignment to const?? - no, it is not the T* that is const, just the T.
Когда вы научитесь читать его так, как это делает компилятор, становится намного легче понять, что представляет собой любой данный сложный тип, а также позволяет вам более легко объявлять сложные типы, когда вам это необходимо. Под сложными типами я говорю о таких вещах, как:
T const * const &
Когда вы знаете, что компилятор читает справа налево, изнутри наружу, то, что это означает, становится вполне очевидным, и когда необходимо написать его, вы можете сделать это легко: ссылка на постоянный указатель на постоянную T. Теперь запишите объявление «ссылки на указатель на постоянный указатель на T». Если вы просто используете обозначение слева направо, я думаю, вы найдете это довольно просто.
Короче говоря, хотя поначалу кажется неестественным учить себя использовать правую> левую грамматику ВСЕ время, а не только тогда, когда это требуется (потому что это часто так), вам будет гораздо проще запомнить, что такое строка кода означает и как написать то, что вы имеете в виду. Это похоже на то, почему я запрещаю "," в объявлениях:
<code>
T* ptr1 = 0, ptr2 = 0; // oops!!!</p>
<p>// do it this way please!
T* ptr1 = 0;
T* ptr2 = 0;
Технически это все одно и то же, но когда вы пытаетесь заставить группу людей разной квалификации работать над одной и той же вещью, вы будете стремиться к тому, чтобы каждый использовал любой метод, который проще всего понять и использовать. Мой опыт научил меня, что "T const &" - это тот метод.