Почему `std::initializer_list` не поддерживает оператор подиндексации?
Вопрос:
Я пишу функцию, которая принимает параметр типа std::initializer_list
, названный list
, и мне необходимо произвести произвольный доступ к элементам этого списка. Было бы удобно использовать list[i]
вместо list.begin()[i]
. Однако, почему в std::initializer_list
не реализован оператор operator[]
?
Не могу придумать случаев, когда operator[]
, возвращающий const T&
, был бы плохо определен. Кроме того, кажется, что проблема не в эффективности, поскольку std::initializer_list<T>::iterator
является алиасом для const T*
, что явно указывает на то, что это случай итератора произвольного доступа.
Почему же std::initializer_list
не предоставляет поддержку оператора []
для удобства работы с элементами?
1 ответ(ов)
По словам Бьёрна Страуструпа в разделе 17.3.4.2 (с. 497) книги "The C++ Programming Language", 4-е издание:
К сожалению,
initializer_list
не предоставляет возможности индексирования.
Дополнительных причин не приводится.
Мое предположение заключается в том, что это одно из следующих:
- Это упущение, или
- Поскольку класс
initializer_list
реализован с использованием массива и для обеспечения безопасного доступа необходимо проводить проверку границ, предоставление такого интерфейса может привести к более небезопасному использованию, или - Для согласованности с парадигмой итерации стандартных алгоритмов, или
- Поскольку
initializer_list
по своей природе является произвольным, существует больше возможностей для ошибок при прямом доступе к ним.
Пункты 2 и 4 звучат довольно слабо. Как и 3. Я склоняюсь к тому, что это упущение (1).
Как создать конструктор, позволяющий использовать braced-init-list?
Когда действительно стоит использовать noexcept?
Возможно ли вывести тип переменной в стандартном C++?
Можно ли вручную определить преобразование для класса enum?
Стоит ли игнорировать предупреждение "-Wmissing-braces" от gcc/clang?