Полезен ли спецификатор 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
классификатор здесь не имеет особого смысла.