C ++: ссылка const, перед vs после спецификатора типа

В чем разница между аргументами в:

int foo1(const Fred &arg) { ... } 

а также

 int foo2(Fred const &arg) { ... } 

? Я не вижу этого случая в FAQ FAQ.

Никакая разница, поскольку const читается справа налево относительно &, поэтому оба представляют ссылку на неизменяемый экземпляр Fred.

Fred& const означает, что эта ссылка сама по себе является неизменной, что является избыточным ; при работе с константными указателями Fred const* и Fred* const действительны, но различны.

Это вопрос стиля, но я предпочитаю использовать const как суффикс, поскольку он может применяться последовательно, включая функции const member .

Поведение

Не существует смысловой разницы между const T& и T const& (и между const T* и T const* ); язык рассматривает их как один и тот же тип.

Как стиль

Что касается того, что вы предпочитаете стилистически, я проигнорирую многие другие ответы и предпочитаю const T&const T* ):

  • const T& – это стиль, используемый в книге программирования Stroustrup The C ++ .
  • const T& – это стиль, используемый в стандарте C ++.
  • const T* – это стиль, используемый в книге программирования языка программирования C & R.
  • const T* – это стиль, используемый в стандарте C.
  • Из-за вышеперечисленных факторов я думаю, что const T& / const T* имеет больше инерции, чем T const& / T const* . const T& / const T* эмпирически кажется мне более распространенным, чем T const& / T const* во всех кодах C ++ и C, которые я видел. Я думаю, что следующие распространенные практики более читабельны, чем догматически придерживаться правил синтаксического анализа справа налево.
  • С T const* , кажется, проще заменить * как T* const (особенно если люди не так привыкли к нему). Напротив, const* T не является юридическим синтаксисом.

Что относительно правила синтаксического анализа справа налево?

Что касается всего аргумента синтаксического анализа права налево, который люди любят использовать: как я упомянул в комментарии к другому ответу, const T& отлично читает справа налево. Это ссылка на константу Т. «T» и «constant» каждый может работать как прилагательное или существительное. (Кроме того, чтение T const* справа налево может быть неоднозначным, поскольку оно может быть неправильно интерпретировано как «константа указателя на T», а не как «указатель на постоянную T»).

Хотя они одно и то же, чтобы сохранить согласованность с правилом RIGHT-LEFT о синтаксическом анализе объявлений C и C ++, лучше написать Fred const &arg

Также обратитесь к этому, чтобы лучше понять объявления, квалификаторы и деклараторы.

Никакой разницы, оба синтаксически и семантически одинаковы.

Оба работают, и вот объяснение от человека, который его написал.
Процитировать его:

Зачем? Когда я изобрел «const» (изначально назывался «readonly» и имел соответствующий «writeonly»), я разрешил ему идти до или после типа, потому что я мог сделать это без двусмысленности.

Ссылки не работают так же, как указатели: для указателей вы можете иметь «константные указатели» ( type * const p ) и «указатель на const» ( const type * p или type const * p ).

Но у вас нет этого для ссылок: ссылка всегда относится к одному и тому же объекту; в этом смысле вы можете считать, что «ссылки» – это ссылки «const» (так же, как вы можете иметь «константные указатели»).

Поэтому что-то вроде «type & const ref» не является законным. У вас может быть только «ссылка на тип» ( type &ref ) и «ссылка на постоянный тип» ( const type &ref или type const &ref , оба они точно эквивалентны).

Последнее: даже если const type звучит более корректно на английском языке, запись type const позволяет более систематически понимать декларации «справа налево»: int const & ref может быть прочитан, поскольку ref является ссылкой на константу int. Или более сложный пример: int const * const & ref , ref – ссылка на константный указатель на константу int.

Вывод: в вашем вопросе оба они точно эквивалентны.

  • Постоянный ресурс ссылки C ++ (контейнерный адаптер)
  • Как скопировать содержимое одного ArrayList в другое?
  • Почему «универсальные ссылки» имеют тот же синтаксис, что и ссылки rvalue?
  • Возможна ли пустая ссылка?
  • Как получить доступ к переменной из другого скрипта в другом игровом объекте через GetComponent?
  • C ++ 11 auto: что, если он получает постоянную ссылку?
  • Является ли практика возвращения ссылочной переменной C ++ злом?
  • Почему C # не поддерживает возврат ссылок?
  • Как ссылаться на общие classы и методы в XML-документации
  • Установить пользовательский путь к ссылочным DLL?
  • Одна ошибка VS2010? Разрешить привязку не-const ссылки на rvalue БЕЗ ДАЖЕ предупреждение?
  • Давайте будем гением компьютера.