EgoRusMarch
@EgoRusMarch
C++ Developer

Как std::initializer_list определяет количество элементов в {списке}?

Если определение типа ещё более менее понятно (в плюсах есть RTTI и т.п.), то каким образом создатели этого класса определяют размер этого списка.
Ведь, на сколько я понимаю, список - это по сути массив. В чистом Си его размер компилятор вычисляет, если сделать так:
char string[] = "string";
или так:
int array[] = {1,2,3,4,5,6,7};
  • Вопрос задан
  • 139 просмотров
Решения вопроса 2
@MarkusD Куратор тега C++
все время мелю чепуху :)
В общем смысле, инициализация может быть выполнена тремя основными способами. std::initializer_list участвует в двух из трех.

Foo bar = {...};
Foo bar{...};


В обоих случаях выполняется List Initialization, в первом - copy list-initialization, во втором - direct list-initialiaztion.

Тут важно отметить что принятие решения о использовании std::initializer_list выполняются только на этапе трансляции. В обоих случаях сперва транслятор попробует придумать std::initializer_list. Если у аргументов типы разные (а приведение типов при такой записи не делается), то попробовать создать std::initializer_list у транслятора не получится. Но если получилось, то транслятор уже итак знает число аргументов, переданных в конструктор.

Образно выражаясь, транслятор прямо перед вызовом конструктора объекта оформляет короткую область видимости, в рамках которой оформляется локальный массив неизменной длины. В этот локальный массив по своему значению складываются аргументы конструктора, далее этот массив обрамляется в std::initializer_list, с которым конструктор и вызывается.
Сразу по завершении конструктора локальная область видимости закрывается и память массива аргументов конструктора освобождается. Поэтому std::initializer_list нельзя копировать, перемещать, сохранять в состоянии конструируемого объекта. std::initializer_list не владеет отображаемой памятью, он только дает к ней доступ.
Ответ написан
Комментировать
EgoRusMarch
@EgoRusMarch Автор вопроса
C++ Developer
Нашёл вот что:
Для решения этих проблем придумали std::initializer_list — "магический класс", который представляет собой очень легкую обертку для массива элементов известного размера, а так же умеет конструироваться от braced-init-list-а. Почему же он "магический"? Как раз по описанным выше причинам его невозможно эффективно сконструировать в пользовательском коде, поэтому компилятор создает его специальным образом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы