В C ++ (ИСО / МЭК 14882: 2003) список выражений в скобках можно использовать для инициализации переменной типа aggregate в объявлении, которое ее определяет.
* 1005 Е.Г. *
struct S { int a; std::string b; };
S x = { 39, "Hello, World\n" };
Тип aggregate - это массив или класс без объявленных пользователем конструкторов, без личных или защищенных нестатических членов-данных, без базовых классов и без виртуальных функций. Обратите внимание, что класс aggregate не обязательно должен быть POD-классом, а любой массив является aggregate независимо от того, является ли тип, из которого он состоит, массивом.
Однако заключенный в скобки список выражений действителен только в качестве инициализатора для агрегата, он обычно не допускается в других контекстах, таких как присваивание или список инициализации членов конструктора класса.
В текущем проекте следующей версии C ++ (C ++ 0x) заключенный в скобки список выражений ( brace-init-list ) разрешен в большем количестве контекстов и при инициализации объекта из такого списка инициализаторов он называется list-initialization .
Новые контексты, где такой список разрешен, включают аргументы в вызове функции, возвращаемые функции, аргументы конструкторам, инициализаторам членов и баз и в правой части присваивания.
Это означает, что это недопустимо в C ++ 03.
int main() {
categories[1] = {1, "First category"};
categories[2] = {2, "Second category"};
}
Вместо этого вы могли бы сделать что-то вроде этого.
int main() {
category tmp1 = { 1, "First category" };
category tmp2 = { 2, "Second category" };
categories[1] = tmp1;
categories[2] = tmp2;
}
В качестве альтернативы.
int main() {
category tmpinit[] = { { 1, "First category" },
{ 2, "Second category" } };
categories[1] = tmpinit[0];
categories[2] = tmpinit[1];
}
Или вы могли бы рассмотреть возможность создания заводской функции для вашего типа. (Вы можете добавить конструктор для вашего типа, но это сделает ваш класс неагрегированным и не позволит использовать агрегатную инициализацию в других местах.)
category MakeCategory( int n, const char* s )
{
category c = { n, s };
return c;
}
int main()
{
categories[1] = MakeCategory( 1, "First category" );
categories[2] = MakeCategory( 2, "Second category" );
}