В C ++ 11 std::array
есть ли у меня гарантия, что синтаксис std::array<T, N> x;
инициализирует все элементы массива по умолчанию?
РЕДАКТИРОВАТЬ : если нет, существует ли синтаксис, который будет работать со всеми массивами (включая массивы нулевого размера) для инициализации всех элементов их значением по умолчанию?
РЕДАКТИРОВАТЬ : в cppreference в описании конструктора по умолчанию говорится:
(constructor) (implicitly declared) (public member function)
default-constructs or copy-constructs every element of the array
так что ответ может быть положительным. Но я хотел бы быть уверенным в этом согласно стандарту или будущему стандарту.
T x[N]
синтаксису.Ответы:
По определению инициализация по умолчанию - это инициализация, которая происходит, когда не указана другая инициализация; язык C ++ гарантирует вам, что любой объект, для которого вы не предоставили явный инициализатор, будет инициализирован по умолчанию (C ++ 11 §8.5 / 11). Сюда входят объекты типа
std::array<T, N>
иT[N]
.Имейте в виду, что существуют типы, для которых инициализация по умолчанию не имеет эффекта и оставляет значение объекта неопределенным: любой неклассовый, не-массивный тип (§8.5 / 6). Следовательно, инициализированный по умолчанию массив объектов с такими типами будет иметь неопределенное значение, например:
Оба массива в стиле c и
std::array
заполнены целыми числами неопределенного значения, так же как иplain_int
имеют неопределенное значение.Я предполагаю, что когда вы говорите «к их значению по умолчанию», вы действительно имеете в виду «инициализировать все элементы
T{}
». Это не инициализация по умолчанию , это инициализация значения (8.5 / 7). Вы можете довольно легко запросить инициализацию значения в C ++ 11, задав каждому объявлению пустой инициализатор:Это по очереди инициализирует значение всех элементов массива, в результате чего
plain_old_int
все члены обоих типов массивов будут инициализированы нулем.источник
boost::value_initialized
ссылкой, но я считаю, что VC12 (VS2013) теперь имеет гораздо лучшую поддержку.Инициализация по умолчанию - это термин из Стандарта, который потенциально означает отсутствие инициализации вообще, поэтому вы, вероятно, имеете в виду нулевую инициализацию. .
Описание на cppreference.com на самом деле немного вводит в заблуждение.
std::array
является агрегатным классом, и если тип элемента является примитивным, это POD: «простые старые данные» с семантикой, близкой к языку C. Неявно определенный конструкторstd::array< int, N >
является тривиальным один , который абсолютно ничего не делает.Синтаксис, подобный
std::array< int, 3 >()
или,std::array< int, 3 > x{}
который предоставляет обнуленные значения, не делает этого путем вызова конструктора. Получение нулей является частью инициализации значения , указанной в C ++ 11 §8.5 / 8:std::array
не имеет конструктора по умолчанию, предоставляемого пользователем, поэтому он инициализируется нулем. Он имеет неявно определенный конструктор по умолчанию, но он тривиален, поэтому он никогда не инициализируется по умолчанию. (Но это не имеет значения, поскольку тривиальная инициализация по определению не имеет никакого эффекта во время выполнения.)Массивы в стиле C и
std::array
оба являются агрегатами, и способ полной инициализации нулями любого агрегата - это синтаксис= {}
. Это работает с C ++ 98. Обратите внимание, что массивы в стиле C не могут иметь нулевой экстент, иsizeof (std::array< X, 0 >)
он не равен нулю.источник
Оба
T x[N];
и поstd::array<T, N> x;
умолчанию инициализируют каждый элемент массива.Например, если
T = std::string
каждый элемент будет пустой строкой. ЕслиT
это класс без конструктора по умолчанию, оба не будут скомпилированы. ЕслиT = int
каждый элемент будет иметь неопределенное значение (если это объявление не находится в области пространства имен)источник
Прежде всего, T x [N] по умолчанию инициализирует элементы, хотя инициализация по умолчанию скалярного типа T фактически ничего не делает. Вышеупомянутое также справедливо для std :: array x. Думаю, вам нужна инициализация списка.
источник
C ++ 11 std :: array :: fill - хороший вариант для некоторых случаев.
источник