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