В C и C ++ можно инициализировать массивы и структуры, используя фигурные скобки:
int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};
Однако в разговор с 2007 года, Бьярне упоминает, что этот синтаксис также работает для скаляров. Я попробовал это:
int i = {7};
И это на самом деле работает! Каково обоснование для разрешения инициализации скаляров с фигурными скобками?
Примечание: я специально не речь идет о равномерной инициализации C ++ 11. Это старый добрый C89 и C ++ 98.
Каково обоснование для разрешения инициализации скаляров с фигурными скобками?
int
это ПОД. Таким образом, инициализация скобки разрешена в случае int
(и для всех встроенных типов), поскольку это делает синтаксис инициализации последовательный с другими POD.
Кроме того, я думаю, что угодно обоснование за C ++ 11 Синтаксис унифицированной инициализации также (частично) применим к этому синтаксису, разрешенному C ++ 03. Это просто C ++ 03 не расширил это, чтобы включить типы не-pod, такие как стандартные контейнеры.
Я вижу одно место, где эта инициализация полезна в C ++ 03.
template<typename T>
void f()
{
T obj = { size() } ; //T is POD: built-in type or pod-struct
//code
}
Теперь это может быть реализовано с struct
который начинается с подходящего члена, а также любого арифметического типа:
struct header
{
size_t size; //it is the first member
//...
};
f<header>(); //body becomes : header obj = { size(); }; which is fine
f<size_t>(); //body becomes : size_t obj = { size(); }; which is fine
Также обратите внимание, что POD, будь то struct или встроенные типы, также может быть одинаково инициализирован как:
header h = header(); //value-initialized
int i = int(); //value-initialized
Так что я верю один причина в последовательности!
Обоснование не упоминается, но от 2005 C ++ Standard черновик, 8.5 Инициализаторы [dcl.init], пункт 14
Если T — скалярный тип, то объявление вида
T x = { a };
эквивалентно
T x = a;
Обратите внимание, что стандарт C ++ 98 допускает только инициализаторы скобок для инициализации копирования T x = { a }
, а не для прямой инициализации T x { a }
, для которого только T x(a)
работает.
ОБНОВИТЬ: см. также это вопрос
C ++, вероятно, унаследовал это от C. В C основная причина заключается в том, чтобы иметь уникальный синтаксис инициализатора, в частности для инициализатора по умолчанию. В C инициализатором по умолчанию является {0}
,