Подтвердить что ты не робот

Const для аргументов без ссылки

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

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

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