Это ограничение GCC, но оно полностью соответствует стандарту. Технически static const int
по-прежнему lvalue
. Вы указали значение inline, поэтому компилятор почти всегда будет использовать его как rvalue
. Есть одно исключение. Абстрактные инструкции, генерируемые компилятором для троичных операторов, запрашивают адрес lvalues
. Отсюда и ошибка, которую вы видите.
Вы можете обойти это, используя enum
. Или, если вы используете новую версию GCC constexpr
, был добавлен к стандарту для решения этой точной проблемы (именованные и набранные значения).
В качестве альтернативы вы можете предоставить компоновщику определение для констант. Например. в вашем файле cpp классов добавьте строку типа
// I wish I had constexpr
const int SomeCls::PERIOD_ALARM_NORMAL;
const int SomeCls::PERIOD_ALARM_THRESH;
В качестве примечания: я был убежденным сторонником static const
для констант области видимости класса. Затем я обнаружил, что MSVC не допускает static const float
со встроенным значением. Таким образом, единственные значения, которые вы можете поместить в static const
, это целые числа, и в этом случае enum
предоставляют все те же функции плюс гарантию того, что они никогда не преобразуются в lvalue
.
.