Введена в C++11 для унификации синтаксиса инициализации. Использует фигурные скобки {}.
int x{5}; // Вместо int x = 5;
std::vector<int> v{1, 2, 3}; // Инициализация списком
int y{7.5}; // Ошибка: narrowing conversion
Widget w{}; // Явный вызов конструктора по умолчанию
Widget w(); // Объявление функции!
Специальный вид инициализации для агрегатных типов.
Тип является агрегатом, если:
struct Point {
int x;
int y;
};
Point p{1, 2}; // Aggregate initialization
int arr[5]{1, 2}; // arr = {1, 2, 0, 0, 0}
| Характеристика | Uniform Initialization | Aggregate Initialization |
|---|---|---|
| Применимость | Любые типы | Только агрегатные типы |
| Синтаксис | {} | {} |
| Порядок | Зависит от конструктора | Порядок объявления членов |
| Сужение типов | Запрещено | Разрешено в C (но не в C++) |
class Widget {
int x;
double y;
public:
Widget(int a, double b) : x{a}, y{b} {}
};
Widget w{10, 3.14}; // Вызов конструктора
struct RGB {
uint8_t r;
uint8_t g;
uint8_t b;
};
RGB white{255, 255, 255}; // Инициализация агрегата
RGB red{.r = 255, .g = 0, .b = 0}; // Явное указание членов
Uniform Initialization ({}):
Aggregate Initialization:
Рекомендация: в современном C++ предпочитайте uniform initialization ({}) как более безопасный и универсальный способ инициализации объектов.