Инициализация скаляров с фигурными скобками

В C и C ++ можно инициализировать массивы и структуры, используя фигурные скобки:

int a[] = {2, 3, 5, 7};
entry e = {"answer", 42};

Однако в разговор с 2007 года, Бьярне упоминает, что этот синтаксис также работает для скаляров. Я попробовал это:

int i = {7};

И это на самом деле работает! Каково обоснование для разрешения инициализации скаляров с фигурными скобками?

Примечание: я специально не речь идет о равномерной инициализации C ++ 11. Это старый добрый C89 и C ++ 98.

11

Решение

Каково обоснование для разрешения инициализации скаляров с фигурными скобками?

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

Так что я верю один причина в последовательности!

4

Другие решения

Обоснование не упоминается, но от 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) работает.

ОБНОВИТЬ: см. также это вопрос

4

C ++, вероятно, унаследовал это от C. В C основная причина заключается в том, чтобы иметь уникальный синтаксис инициализатора, в частности для инициализатора по умолчанию. В C инициализатором по умолчанию является {0},

1