const для нереферентных аргументов - PullRequest
13 голосов
/ 25 мая 2011

Если у меня есть этот код:

void Foo(aBasicType aIn) //Where aBasicType is int, char etc.
{
    //...
}

Есть ли смысл делать его const aBasicType, так как он все равно будет скопирован?Одна из причин, которые я спрашиваю, состоит в том, что я видел это в стороннем коде и задавался вопросом, есть ли что-то, о чем я не знаю.

Ответы [ 7 ]

11 голосов
/ 25 мая 2011

Невозможно объявить его const, если вы знаете, что вашей функции не нужно изменять свое значение во время выполнения.

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

Объявление вашей переменной const может помешать вам написать if (aIn = someValue).

1 голос
/ 25 мая 2011

Причина информативна: вы хотите, чтобы компилятор предупреждал / выдавал ошибку, когда переданный в значение аргумент виден слева от присваивания.Это немного громоздко, это видно на библиотеках, чья аудитория может быть меньше, чем «хорошо информированная» на C или C ++ (это одинаково для обоих языков).

1 голос
/ 25 мая 2011

Я иногда (нечасто) делаю это, когда возникает соблазн изменить aIn на месте вместо создания другой копии, но метод полагается на aIn, оставаясь неизменным на протяжении всего. Это, как правило, близкий звонок.

0 голосов
/ 31 января 2018

Я думаю, что могу сформулировать это намного проще. Когда footype не является параметром шаблона:

  • const footype & в подписи является гарантией для абонента функция и ограничение для реализатора функции.

  • const footype, с другой стороны, является только ограничением для
    реализатор и не имеет отношения к вызывающему.

Если footype является параметром шаблона, то правила могут быть проверены только в отношении отдельных экземпляров шаблона.

Кстати, если вы видите константные ограничения, то подключенный код намного легче читать, потому что возможности того, что код может сделать, сильно ограничены. Это одна из многих причин, почему C ++ легче читать, чем C # или Java.

0 голосов
/ 25 мая 2011

Я предпочитаю добавлять квалификатор const во входные параметры независимо от метода передачи параметров (по значению, по указателю или по ссылке). Таким образом, const параметр просто означает «входной параметр», а неконстантный параметр означает «выходной параметр» (или, редко, inout параметр). Полагаю, такое соглашение делает код более понятным, но это, конечно, дело вкуса.

0 голосов
/ 25 мая 2011

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

0 голосов
/ 25 мая 2011

Это сделало бы значение const для этой функции, что может быть полезно так же, как объявление константы в верхней части вашей функции может быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...