Присвоение initializer_list для std :: array - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь назначить initializer_list для std :: array, как показано ниже:

std::array<int,2> arr = {0,1};
arr = {0,1,2};

Сразу же я получаю сообщение об ошибке, говорящее, что для оператора нет допустимой перегрузки =

Я знаючто я не могу попытаться назначить список инициализатора, размер которого больше размера массива, но я просто пытаюсь понять, как это делает std :: array.

Я пытался просмотреть код на https://code.woboq.org/gcc/libstdc++-v3/include/std/array.html но я не вижу перегруженного оператора = там.Так как же std :: array использует оператор по умолчанию =, чтобы пометить такие попытки как ошибку компилятора.Как оператор по умолчанию знает, как проверить размер initializer_list?Пожалуйста, помогите мне понять это.

1 Ответ

0 голосов
/ 05 декабря 2018

Если вы внимательно прочитаете предоставленную вами кодовую ссылку, вы увидите это в комментариях @ line 112 -

// Нет явного построения / копирования / уничтожения для агрегатного типа.

std :: array - это агрегатный тип, который (элементы которого по отдельности) могут быть инициализированы с использованием списка инициализированных фигурных скобок, как обычный массив.

Код @ lines 109, 110

typedef _GLIBCXX_STD_C::__array_traits<_Tp, _Nm> _AT_Type;
typename _AT_Type::_Type                         _M_elems;

определяет регулярный массив в стеке с размером _Nm, который в вашем случае равен 2.

Таким образом, когда вы присваиваете arr список фигурных инициализаторов, список инициализаторов используется для создания временного std::array<int,2>, который затем копируется в ваш массив с помощью оператора присваивания по умолчанию.Эта операция была бы успешной, только если размер списка инициализаторов меньше или равен 2. Когда вы передаете список фигурных инициализаторов с размером больше 2, он помечается как ошибка, поскольку невозможно создать std::array<int,2> из списка в скобках размером больше 2.

...