До C ++ 11 ми могли виконувати ініціалізацію в класі лише для статичних членів const цілого або типу перелічення. Страуструп обговорює це у своїх запитаннях щодо C ++ , наводячи такий приклад:
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error: not integral
};
І наступні міркування:
То чому ж існують ці незручні обмеження? Клас зазвичай оголошується у файлі заголовка, а файл заголовка, як правило, включається до багатьох одиниць перекладу. Однак, щоб уникнути складних правил компонування, С ++ вимагає, щоб кожен об'єкт мав унікальне визначення. Це правило було б порушено, якби C ++ дозволяв у класі визначати сутності, які потрібно зберігати в пам'яті як об'єкти.
Однак C ++ 11 послаблює ці обмеження, дозволяючи ініціалізацію в класі нестатичних членів (§12.6.2 / 8):
У не делегуючому конструкторі, якщо даний нестатичний член даних або базовий клас не позначається мем-ініціалізатором-ідентифікатором (включаючи випадок, коли немає списку мем-ініціалізаторів, оскільки конструктор не має ініціатора ctor ) і сутність не є віртуальним базовим класом абстрактного класу (10.4), тоді
- якщо сутність є нестатичним членом даних, який має ініціалізатор фігурної дужки або рівного , сутність ініціалізується, як зазначено в 8.5;
- інакше, якщо сутність є варіантом (9.5), ініціалізація не виконується;
- в іншому випадку сутність ініціалізується за замовчуванням (8.5).
Розділ 9.4.2 також дозволяє ініціалізацію в класі неконстантних статичних членів, якщо вони позначені значком constexpr
специфікатором.
То що трапилося з причинами обмежень, які ми мали в C ++ 03? Ми просто приймаємо "складні правила компонування" чи щось інше змінилося, що полегшує це впровадження?