Ответ 1
Правила всегда были следующими:
-
A
const
элемент статических данных (SDM) интегрального или перечисляемого типа может быть инициализирован в классе с постоянным выражением. -
A
constexpr
SDM должен быть инициализирован в классе с постоянным выражением.С++ 17 больше не требует инициализатора, когда конструктор по умолчанию инициализирует каждый элемент. Кроме того,
constexpr
SDM являются неявно встроенными переменными, что делает их объявление определением (внешние определения теперь устарели). - Другие типы SDM могут иметь инициализатор в своем определении (который находится в классе, если этот SDM объявлен
inline
).
Ничто существенно не изменилось между С++ 03 и С++ 11 + для кода, действительного на обоих языках.
Обратите внимание, что для SDM, которые не являются встроенными, объявление класса не является определением &mdash, независимо от того, предоставлен ли инициализатор — и они должны быть определены, если они используются odr.
Начиная с С++ 17, мы можем сделать ваш SDM inline, что делает его определение в классе определением:
class BufferedOutput
{
static inline long bytecount = 50;
};