Интересный вопрос не тот, который вы задаете, а наоборот:
Почему константным интегральным статическим элементам разрешено присваивать значение в объявлении ?
Важным вопросом является объявление .Значение, которое получает переменная, задается в переменной definition , и это согласуется с неконстантными или нецелыми статическими членами класса, где в классе вы предлагаете только объявление .Значение инициализатора предоставляется в определении , которое находится за пределами определения класса, обычно в .cpp, который гарантирует, что оно будет определено в одной единице перевода.
Нопочему интегральные статические константы могут иметь значение в объявлении?
По практическим соображениям.Компилятор может использовать интегральные константы как константы времени компиляции , то есть он может фактически заменить значение константы вместо идентификатора во всех местах, где константа используется как rvalue , например, при определении размера массива.Но если значение присутствует только в определении в одной единице перевода, компилятор не сможет использовать ее во всех других единицах перевода.В качестве примера:
// fq.h
struct fixed_queue {
static const std::size_t max_elements; // [1]
int data[ max_elements ]; // Error: How big is data??
};
// fq.cpp
#include "fq.h"
const std::size_t fixed_queue::max_elements = 10;
Если бы max_elements
не было разрешено иметь значение в объявлении [1], то вы не сможете использовать эту константу для определения размера массива data
, что вполне разумно использовать для статической константы.
Почему бы не распространить это на все другие случаи?
Потому что, похоже, это не имеет особого смысла... Предоставление значения в определении класса не может использоваться компилятором ни при каких других обстоятельствах, и, следовательно, оно не требуется, поэтому только интегральные константы должны обрабатываться по-разному.