Как известно, ссылки нельзя переназначать, поскольку они все время ссылаются на один и тот же объект и, следовательно, всегда постоянны. Однако синтаксис С++ допускает существование постоянных ссылок:
int var = 33;
int const & r1 = var; // ссылка на константу
int & const r2 = var; // постоянная ссылка
r1
В случае с ссылками на константы, все достаточно очевидно. Если аргумент передаётся в функцию "по ссылке", то модификатор const, может использоваться для защиты значения от случайных изменений в процессе написания кода программы.
r2
А вот в чем смысл явного указания постоянства ссылки?
И где это может применяться на практике мне не понятно.
GCC (gcc-5.1) на ideone не компилирует ваш код:
prog.cpp: In function 'int main()':
prog.cpp:8:17: error: 'const' qualifiers cannot be applied to 'int&'
int & const r2 = var; // постоянная ссылка
Visual Studio 2015 при компиляции выдаёт предупреждение:
test.cpp(11): warning C4227: anachronism used: qualifiers on reference are ignored
Текущий стандарт, 8.3.2/1 (кстати, ссылка на него здесь), говорит об этом следующее:
Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.simple]), in which case the cv-qualifiers are ignored.
Таким образом, const, относящий к ссылке, либо недопустим, либо будет проигнорирован.
Ваш вопрос как-будто построен на неявном предположении, что допустимость такой конструкции с точки зрения грамматики языка каким-то образом подразумевает ее "нужность" или "осмысленность".
Это неверное предположение.
Грамотный дизайн языка как раз и требует выбора разумного распределения областей ответственности между формальным синтаксисом (т.е. грамматикой) и дополнительными правилами, описываемыми отдельно, "на словах". Попытки реализовать всевозможные подобные ограничения целиком на уровне грамматики языка привели бы к неимоверно переусложненной грамматике. В данном случае, очевидно, было принято решение не пытаться реализовывать это ограничение на уровне грамматики.
Спецификация языков С и С++ содержат огромное количество примеров таких ситуаций, где ограничения, которые можно было бы отнести к чисто синтаксическим (возможно с определенной натяжкой), тем не менее реализуются не на уровне грамматики языка, а в виде отдельно описываемых ограничений.
Например, в языке С (и, до относительно недавнего времени, в С++) запрещалось использовать оператор "запятая" в константных выражениях. Однако несмотря на то, что грамматики этих языков имеют отдельные нетерминальные символы для "константного выражения", этот запрет реализовался на уровне грамматики только для "запятых" верхнего уровня. А запрет на использование более глубоких "запятых" (внутри скобок) в грамматике не отражен, а сформулирован в спецификации языка "на словах", ибо выстраивать совершенно независимую под-грамматику константных выражений было бы слишком расточительно.
Продвижение своими сайтами как стратегия роста и независимости