Способы инициализации контейнеров STL, массивов в стиле C - PullRequest
0 голосов
/ 01 ноября 2019

Я видел, как стандартные массивы инициализируются с помощью {{0}}, например std::array<size_t, 3> dim = {{0}}.

Это стандартный подход? Могу ли я использовать тот же подход для повторной инициализации? То есть

void foo(std::array<size_t, 3>& dim)
{
   dim = {{0}};
}

Можно ли использовать тот же метод для инициализации массива в стиле C? Например

void foo(size_t dim[3])
{
   dim = {{0}};
}

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

std::array<size_t, 3> dim = {{0}} инициализирует std :: array из braced-init-list (сокращенно {} -list).

Это форма инициализации списка, как объяснено здесь https://en.cppreference.com/w/cpp/language/aggregate_initialization. Примечаниечто любой тип, который предоставляет конструктор, принимающий std :: initializer_list, также разрешит инициализацию из braced-init-list, так как язык C ++ отображает {} -list в std :: initializer_list.

Оператор dim = {{0}}; вызовет инициализацию копирования списка, как описано здесь https://en.cppreference.com/w/cpp/language/list_initialization

Однако size_t dim[3]; dim[3] = {{0}}; приведет к ошибке, так как тип size_t не предоставляет конструктор, принимающий std::. initializer_list

0 голосов
/ 01 ноября 2019

Вы не можете использовать его в массиве / структурах в стиле c, поскольку массив в стиле c не имеет оператора присваивания.

...