Назначение initializer_list для std :: array

Я пытаюсь назначить 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? Пожалуйста, помогите мне понять это.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
288
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы внимательно прочтете ссылку на код, которую вы предоставили, вы увидите, что это упомянуто в комментариях @ строка 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.

Другие вопросы по теме