Инициализация константной переменной - PullRequest
0 голосов
/ 18 июня 2011

Можем ли мы инициализировать переменную const следующим образом

int var1 = 10;
const int var2 = var1;

Приведет ли это к какому-либо предупреждению / ошибке в любом компиляторе?

Ответы [ 2 ]

12 голосов
/ 18 июня 2011

Зависит от того, где находится код.

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

Если он находится в области видимости файла, так что var1 и var2 являются статиками, то нет, это не нормально. Константный целочисленный объект в области видимости файла должен быть инициализирован значением, определенным для того, чтобы быть известным во время компиляции (в C ++ это называется «целочисленным константным выражением», я забываю, является ли это также точной терминологией Си). В этом случае вы можете подумать, что, поскольку между этими двумя определениями нет кода, значение var1 будет известно во время компиляции как 10, но поскольку тип неконстантный, стандарт все равно запрещает его , Вы можете думать об этом, как о том, чтобы избежать необходимости быть достаточно умными реализациями, чтобы применять эту аргументацию и доказать, что нет ничего способного изменить var1: все, на что он должен смотреть, - это тип, а не промежуточный код.

1 голос
/ 18 июня 2011

Да, все в порядке. Это часть стандартов C и C ++. Постоянный объект может быть инициализирован неконстантным объектом. Почему бы и нет?

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