Как называется назначение через фигурные скобки?и можно ли это контролировать? - PullRequest
29 голосов
/ 14 апреля 2011

Как это называется?

Vec3 foo = {1,2,3};

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

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

1 Ответ

43 голосов
/ 14 апреля 2011

Это не назначение.Это инициализация.

Такая инициализация разрешена только для агрегата, который включает класс 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. ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...