Современный способ инициализации объектов в C++ - это форма инициализации, использующая фигурные скобки. Это называется инициализация списком (или равномерной инициализацией, или инициализацией скобками).
Списочная инициализация бывает трех видов:
int width{5}; // прямая инициализация списком значения 5 в переменную width (предпочтительно)
int height = {6}; // копирующая инициализация списком значения 6 в переменную height
int depth {}; // инициализация значений
До появления списочной инициализации некоторые типы инициализации требовали использования инициализации копированием, а другие - прямой инициализации. Инициализация списков была введена для обеспечения более последовательного синтаксиса инициализации (поэтому ее иногда называют "унифицированной инициализацией"), который работает в большинстве случаев.
Инициализация списком запрещает сужающие преобразования
Основное преимущество списочной инициализации заключается в том, что "сужающие преобразования" запрещены. Это означает, что если вы попытаетесь инициализировать переменную списком, используя значение, которое переменная не может безопасно хранить, компилятор должен выдать диагностику (обычно ошибку). Например:
int main()
{
// Целое число может содержать только недробимые значения
int w1 { 4.5 }; // Ошибка компиляции: Инициализация списком не позволяет сузить преобразование 4.5 в 4
int w2 = 4.5; // компилируется: инициализация копированием инициализирует w2 значением 4
int w3(4.5); // компилируется: прямая инициализация инициализирует w3 значением 4
return 0;
}