внутри функции/метода равнине const
переменная может, например, быть вычислены из параметров и назначены разные значения в пределах соответствующих вызовов функции/метода, в то время как static const
можно инициализируется только один раз (возможно, из параметров), а последующие вызовы просто не влияют на его значение. Чтобы проиллюстрировать эту разницу, взгляните на следующую демо:
#include <iostream>
using std::cout;
using std::endl;
void
non_static_case(int x, int y) {
const int z = x + y;
cout << z << endl;
}
void
static_case(int x, int y) {
static const int z = x + y;
cout << z << endl;
}
int
main() {
non_static_case(1, 2);
non_static_case(3, 4);
cout << endl;
static_case(1, 2);
static_case(3, 4);
}
Выход:
3
7
3
3
Вы можете ясно видеть, что z
внутри функции static_case
, после инициализации для 1-й раз, не делает изменение при последующих вызовах.
Следует отметить, что обычно компиляторы используют скрытый флаг, чтобы указать, была ли инициализирована локальная переменная static
. Этот флажок проверяется на каждой записи функции, и это приводит к небольшим накладным расходам. Тем не менее, в этом конкретном случае , когда рассматриваются только примитивные типы, и переменная назначается константе времени компиляции, я не сомневаюсь, что полученный код будет оптимизирован компилятором и фактически не будет использоваться скрытый флаг. В результате я бы сказал, что есть нет причин предпочитать один подход над другим, в данном конкретном случае.
В случае, если переменная является членом какого-либо класса, применяются те же правила, что и для переменной внутри функции/метода. Член const
может быть вычислен в списке инициализации конструктора и связан с конкретным экземпляром класса, тогда как static const
один устанавливается во время инициализации запуска программы и остается неизменным для остальной части исполнения и равен «общий» среди всех экземпляры класса.
Правда, ясно, что статическая квалификация препятствует переназначению. В исходном вопросе возникает вопрос, есть ли причина предпочесть «static const POD» или «const POD» для переменных, которые являются локальными для функции класса, которые всегда оцениваются с одинаковым значением. –
@Alan: Хорошая точка, обновлено. –