Это не назначение.Это инициализация.
Такая инициализация разрешена только для агрегата, который включает класс POD.POD означает «Простой старый тип данных».
Пример,
//this struct is an aggregate (POD class)
struct point3D
{
int x;
int y;
int z;
};
//since point3D is an aggregate, so we can initialize it as
point3D p = {1,2,3};
См. Выше скомпилированные штрафа: http://ideone.com/IXcSA
Но, опять же, учтите это:
//this struct is NOT an aggregate (non-POD class)
struct vector3D
{
int x;
int y;
int z;
vector3D(int, int, int){} //user-defined constructor!
};
//since vector3D is NOT an aggregate, so we CANNOT initialize it as
vector3D p = {1,2,3}; //error
Выше не компилируется.Это выдает эту ошибку:
prog.cpp: 15: ошибка: скобки вокруг инициализатора для неагрегированного типа 'vector3D'
Смотрите сами: http://ideone.com/zO58c
В чем разница между point3D
и vector3D
?Просто vector3D
имеет пользовательский конструктор, и это делает его не POD.Следовательно, его нельзя инициализировать с помощью фигурных скобок!
Что такое агрегат?
Стандарт гласит в разделе §8.5.1 / 1,
Агрегат представляет собой массив или класс (раздел 9) с без объявленных пользователем конструкторов (12.1), без личных или защищенных нестатических элементов данных (пункт 11), без базовых классов (пункт 10) и без виртуальных функций (10.3).
И затем говорится в §8.5.1/ 2 что,
Когда агрегат инициализируется, инициализатор может содержать предложение инициализатора, состоящее из заключенного в скобки, разделенного запятыми списка предложений инициализатора для членов агрегата, записанного вувеличение индекса или порядка членов.Если агрегат содержит субагрегаты, это правило применяется рекурсивно к членам субагрегата.
[Example:
struct A
{
int x;
struct B
{
int i;
int j;
} b;
} a = { 1, { 2, 3 } };
initializes a.x with 1, a.b.i with 2, a.b.j with 3. ]