Ответ 1
Это не присвоение. Это инициализация.
Такая инициализация разрешена только для агрегата, включающего класс POD. POD означает обычный тип данных Old.
Пример
//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. ]