Явное указание постоянства ссылок, в чем смысл?

343
22 января 2017, 15:21

Как известно, ссылки нельзя переназначать, поскольку они все время ссылаются на один и тот же объект и, следовательно, всегда постоянны. Однако синтаксис С++ допускает существование постоянных ссылок:

int var = 33;
int const & r1 = var; // ссылка на константу
int & const r2 = var; // постоянная ссылка

r1

В случае с ссылками на константы, все достаточно очевидно. Если аргумент передаётся в функцию "по ссылке", то модификатор const, может использоваться для защиты значения от случайных изменений в процессе написания кода программы.

r2

А вот в чем смысл явного указания постоянства ссылки?
И где это может применяться на практике мне не понятно.

Answer 1

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, относящий к ссылке, либо недопустим, либо будет проигнорирован.

Answer 2

Ваш вопрос как-будто построен на неявном предположении, что допустимость такой конструкции с точки зрения грамматики языка каким-то образом подразумевает ее "нужность" или "осмысленность".

Это неверное предположение.

Грамотный дизайн языка как раз и требует выбора разумного распределения областей ответственности между формальным синтаксисом (т.е. грамматикой) и дополнительными правилами, описываемыми отдельно, "на словах". Попытки реализовать всевозможные подобные ограничения целиком на уровне грамматики языка привели бы к неимоверно переусложненной грамматике. В данном случае, очевидно, было принято решение не пытаться реализовывать это ограничение на уровне грамматики.

Спецификация языков С и С++ содержат огромное количество примеров таких ситуаций, где ограничения, которые можно было бы отнести к чисто синтаксическим (возможно с определенной натяжкой), тем не менее реализуются не на уровне грамматики языка, а в виде отдельно описываемых ограничений.

Например, в языке С (и, до относительно недавнего времени, в С++) запрещалось использовать оператор "запятая" в константных выражениях. Однако несмотря на то, что грамматики этих языков имеют отдельные нетерминальные символы для "константного выражения", этот запрет реализовался на уровне грамматики только для "запятых" верхнего уровня. А запрет на использование более глубоких "запятых" (внутри скобок) в грамматике не отражен, а сформулирован в спецификации языка "на словах", ибо выстраивать совершенно независимую под-грамматику константных выражений было бы слишком расточительно.

READ ALSO
Write access violation при записи в динамический массив C++

Write access violation при записи в динамический массив C++

Здравствуйте! Есть следующая проблемаЕсть класс Упражнение_1 для домашней работы, в котором должны быть функции создания и инициализации...

436
#1054 - Unknown column '' in 'where clause'

#1054 - Unknown column '' in 'where clause'

В sql не силён, составил запрос:

331
Сумма сумм в запросе

Сумма сумм в запросе

Есть такой запрос

348