Полезен ли спецификатор const при инициализации копирования переменной?

Я хотел бы знать, каковы преимущества и недостатки при использовании дополнительного const квалификатор при инициализации переменных, не являющихся ссылками / указателями, с копией значения:

например:

  • void f(const T v) вместо void f(T v) // v does not need to be changed
  • if (const int err = f()) {/*...*/} вместо if (int err = f()) {/*...*/}
  • или даже void f() {const T* const v = p; /*...*/} вместо void f() {const T* v = p; /*...*/}

Это просто вопрос стиля? Что стандарт C++11 использует в своих примерах? Не могла const быть подсказкой для компилятора для хранения переменных в некоторой специальной постоянной памяти (в некоторых реализациях)?

4 ответа

Решение

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

const в этих 3 контекстах означает, что вы не можете изменить переменную. Но если вы пропустите это, компилятор все равно увидит, что вы не изменили переменную. Современные компиляторы проверят все присвоения переменной и обнаружат, что существует только одна инициализация.

Нет, это бесполезно. Там нет реальных примеров оптимизации компилятора на основе const, Нет смысла объявлять такие переменные как const,

Прототип функции такой:

void f(const T& arg);

говорит вызывающей стороне: "Я не буду менять переданный аргумент, хотя вы передадите его по ссылке".

Но для передачи по значению:

void f(const T arg);

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

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

Другие вопросы по тегам