В общем
Переменная static
внутри класса, как и все остальные, по умолчанию представляет собой объявление . Затем C ++ требует от вас предоставить единственное определение для сущности, для которого оно требуется, - это правило единого определения. Определение - это то, куда идет инициализатор (который является не присваиванием, а конструкцией), поскольку также должен быть только один. Обычно он помещается в файл .cpp, поэтому его невозможно случайно скопировать с помощью #include
s.
Постоянный регистр
Когда статический член является константным целым числом или перечислением и инициализируется выражением времени компиляции, инициализатор может быть помещен в объявление, а определение пропущено. Это результат комбинации старых правил и не очень интересный сегодня IMO.
Правильная встроенная инициализация
Поскольку в C ++ 17 введены inline
переменные, вы можете использовать их как static
членов. Правила примерно такие же, как у inline
функций, и довольно разумны: вы можете предоставить множественное определение сущности inline
, вы несете ответственность за то, чтобы все они были строго идентичны, а реализация ответственна за сведение их в одно определение с его инициализатором. Итак, то, что вы ищете, написано:
struct Foo {
static inline int bar = 42;
// ^^^^^^
};