std :: array <T>инициализация - PullRequest
12 голосов
/ 14 января 2012

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

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

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

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

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

1 Ответ

14 голосов
/ 14 января 2012

Преимущество в том, что у вас есть ... меньше печатать. Но недостатком является то, что вам разрешено снимать скобки только тогда, когда декларация имеет такую ​​форму. Если вы пропустите =, или если массив является членом, и вы инициализируете его с 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} };
...