Я пытаюсь назначить initializer_list для std :: array, как показано ниже:
std::array<int,2> arr = {0,1};
arr = {0,1,2};
Сразу появляется сообщение об ошибке, что для operator = нет жизнеспособной перегрузки.
Я знаю, что не могу попытаться назначить список инициализаторов, размер которого больше размера массива, но я просто пытаюсь понять, как это делает std :: array.
Я пробовал просмотреть код в https://code.woboq.org/gcc/libstdc++-v3/include/std/array.html, но не вижу там перегруженного оператора =. Итак, как std :: array использует оператор по умолчанию =, чтобы пометить такие попытки как ошибку компилятора. Как оператор по умолчанию = знает, что нужно проверить размер initializer_list? Пожалуйста, помогите мне понять это.





Если вы внимательно прочтете ссылку на код, которую вы предоставили, вы увидите, что это упомянуто в комментариях @ строка 112 -
// No explicit construct/copy/destroy for aggregate type.
std :: array - это агрегированный тип, который (элементы которого по отдельности) можно инициализировать с помощью списка инициализаторов в фигурных скобках, как и обычный массив.
Код @ строки 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.