Подтвердить что ты не робот

Что называется назначением через фигурные скобки? и можно ли это контролировать?

Что называется?

Vec3 foo = {1,2,3};

Можно ли это контролировать с помощью оператора или какого-то такого? Как я могу указать, как это должно действовать?

Например, если бы у меня был какой-то сложный класс, я мог бы использовать его для назначения переменных? (Просто упражнение в любопытстве).

4b9b3361

Ответ 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. ]