Подтвердить что ты не робот

Каков правильный способ инициализации статических данных в С++ (98, 11 и 14)

Каков правильный способ инициализации элементов данных static на С++? Меня также интересует, как он изменился с С++ 98, на С++ 11 до С++ 14.

Вот пример:

// bufferedOutput.h
class BufferedOutput
{
 // Static member declaration.
 static long bytecount;
};

// bufferedOutput.cpp
long BufferedOutput::bytecount = 50;

Существуют ли другие способы инициализации элементов данных static?

4b9b3361

Ответ 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;
};