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

Инициализация std:: array <T>

A std::array<T> - это, по сути, массив C-стиля, завернутый в struct. Для инициализации struct требуются скобки, и для инициализации массивов также требуются фигурные скобки. Поэтому мне нужны две пары фигурных скобок:

std::array<int, 5> a = {{1, 2, 3, 4, 5}};

Но в большинстве примеров кода, который я видел, используется только одна пара фигурных скобок:

std::array<int, 5> b = {1, 2, 3, 4, 5};

Как это разрешено, и имеет ли он какие-либо преимущества или недостатки по сравнению с первым соглашением?

4b9b3361

Ответ 1

Преимущество в том, что у вас есть... меньше, чем тип. Но недостатком является то, что вам разрешено оставлять скобки, когда декларация имеет эту форму. Если вы оставите =, или если массив является членом, и вы инициализируете его с помощью member{{1, 2, 3, 4, 5}}, вы можете не только передать одну пару фигурных скобок.

Это связано с тем, что возникли проблемы с возможными недочетами при перегрузке, когда фигурные скобки передаются в функции, как в f({{1, 2, 3, 4, 5}}). Но это вызвало некоторое обсуждение, и отчет о проблеме был сгенерирован.

По существу, инициализация = { ... } всегда была способна опустить фигурные скобки, как в

int a[][2] = { 1, 2, 3, 4 };

Это не ново. Новым является то, что вы можете опустить =, но тогда вы должны указать все фигурные скобки

int a[][2]{ {1, 2}, {3, 4} };