Преимущество объявления его const заключается в том, что вы не можете «случайно» изменить его в неясном виде, который может пропустить проверку кода. Например, передав его ссылкой в функцию, которая изменяет свой параметр.
Спорным недостатком является то, что вы не можете (легко) передать его в код, который принимает неконстантную ссылку, которую он фактически не модифицирует. Если вы действительно верите в C++, это на самом деле преимущество в маскировке, потому что это побуждает вас сделать остальную часть вашего кода const-correct. Но если вам нужно сделать быстрые изменения (например, при отладке), или если вы уже опубликовали API и не можете его изменить, тогда вам будет казаться, что это хорошая черта.
Если функции являются короткими, то вам действительно не нужно «const», чтобы указать, будет ли локальная переменная явно изменена путем назначения. Вы можете увидеть все виды использования переменной прямо там, перед вами. Но в реальной жизни, где функции иногда становятся длинными; и где люди используют неконстантные ссылочные параметры, а иногда и макросы; и где вы хотите как можно быстрее прочитать и понять код; то это может немного помочь.
Я стараюсь использовать его, когда помню, и не потею, если забываю. Я использую большинство из них, когда мне нужно удалить const из переменной. Это говорит мне, что моя первоначальная концепция этой переменной была неправильной, и мне нужно тщательно проверить, что никакое выражение, использующее ее, не полагается на нее, не меняется. Учитывая, что C++ имеет ключевое слово const, если вы собираетесь писать код, который зависит от переменной, не изменяющейся, вы также можете получить компилятор на вашей стороне.
Обычно не стоит беспокоиться о оптимизации компилятора. Хороший компилятор (gcc) может сказать, что если вы не изменяете переменную и не принимаете никаких ссылок на нее, тогда она может применить соответствующие оптимизации, отметите ли вы ее const или нет.
Разве компилятор не достаточно умный, чтобы обнаружить это? – erikkallen
@erikkallen: Да, конечно. Вот почему они разные. Если компилятор не смог его обнаружить, то с ними нельзя было бы обращаться иначе. –
@Tomalak: Да, но компилятор также может быть достаточно умным, чтобы знать, что значение не изменяется после закрытия. – erikkallen