2012-01-14 6 views
12

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

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

Но большая часть кода примера я видел использует только одну пару скобок:

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

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

+0

Я не уверен, что _is_ разрешено стандартом - возможно, составители, которые принимают этот код основаны на ранее C++ 11, или просто дать предупреждение, поскольку это расширение, допускающее плохо сформированный код. – ildjarn

+0

@ildjarn Согласно Йоханнесу, это разрешено. – fredoverflow

ответ

14

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

Можете ли вы предоставить стандартную цитату, которая оправдывает наличие только одной пары брекетов? – fredoverflow

+1

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1270 –

 Смежные вопросы

  • Нет связанных вопросов^_^