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

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

например:

  • 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 не может быть подсказкой компилятору хранить переменные в некоторой специальной постоянной памяти (в некоторых реализациях)?

c++
4 голоса | спросил Martin 15 MarpmFri, 15 Mar 2013 14:26:07 +04002013-03-15T14:26:07+04:0002 2013, 14:26:07

4 ответа


0

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

ответил user2116939 15 MarpmFri, 15 Mar 2013 14:32:01 +04002013-03-15T14:32:01+04:0002 2013, 14:32:01
0

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

ответил MSalters 15 MarpmFri, 15 Mar 2013 14:37:44 +04002013-03-15T14:37:44+04:0002 2013, 14:37:44
0

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

ответил Puppy 15 MarpmFri, 15 Mar 2013 14:45:11 +04002013-03-15T14:45:11+04:0002 2013, 14:45:11
0

Прототип функции, подобный этому:

void f(const T& arg);

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

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

void f(const T arg);

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

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

ответил LihO 15 MarpmFri, 15 Mar 2013 14:38:46 +04002013-03-15T14:38:46+04:0002 2013, 14:38:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132