В следующем коде я пытаюсь инициализировать массивы (необработанные C-classic и std::array
), сводя к минимуму использование типа элемента, т.е. S
:
#include <array>
struct S { unsigned u; int i; };
auto std_array = std::array<S, 3>{
S{0U, 0},
S{1U, 1},
S{2U, 2}
};
S raw_array[] = {
{0U, 0},
{1U, 1},
{2U, 2}
};
/* // compile error: excess elements in struct initializer
std::array<S,3> std_array_no_type = {
{0U, 0},
{1U, 1},
{2U, 2}
};
*/
std::array<S,3> std_array_one_type_only = {
S{0U, 0},
{1U, 1},
{2U, 2}
};
int main() {}
Используя raw_array
, я могу указать S
только один раз. Но попытка сделать то же самое с std::array
не работает (см. комментарий std_array_no_type
). Я должен указать тип S
для каждого или (это тоже интересная часть вопроса) только для первого элемента в списке инициализаторов (см. std_array_one_type_only
).
Итак, есть ли способ определить инициализированный объект std::array
, используя тип S
только один раз? Если нет, то в соответствии с каким пунктом стандарта? И почему один явный тип S
позволяет компилировать std_array_one_type_only
?