Добавить operator[] для initializer_list

dix75
dix75

На текущий момент в реализации initializer_list отсутсвует operator[] или иная функция-член для получения значения по индексу.

Было бы разумно, добавить такую необходимость.

p.s.

1. Обход листа циклом for each иногда не является достаточным решением.

2. Использование других контейнеров для выполнения функций initializer_list является не правильным решением, но в случае пунка 1 необходимым, на текуший момент.

7
рейтинг
5 комментариев
mrgordonfreman
Можно пойти дальше и добавить в std::initializer_list все const-методы из std::array (rbegin, rend, empty, front, back).
Сейчас обращение по индексу можно так сделать
void foo(std::initializer_list<int> init) {
for (size_t i = 0; i < init.size(); i += 2)
std::cout << *(init.begin() + i) << ' ';
std::cout << std::endl;
}
Можете привести пример, когда вместо initializer_list пришлось использовать другие контенйнеры?
mrgordonfreman
dix75
mrgordonfreman, Согласно стандарту begin() + index не гарантирует правильное поведение (не оговорено, что используются random access iterator) , но если посмотреть внимательно то стандарт также говорит, что
constexpr const E* end() const noexcept; Returns:
begin() + size()
логично предположить, что должно работать правильно, но для более правильного поведения, все же лучше использовать std::advance, std::distance и др.
dix75
dix75
mrgordonfreman, Самое большое ограничение это не возможность копирования
18.9.2 Copying an initializer list does not copy the underlying elements.
В этом случае приходится использовать vector, хотя это и избыточно
dix75
dix75
mrgordonfreman,
struct Cool {
std::initializer_list<int> list_;
Cool(std::initializer_list<int> list)
: Cool("", list){} // UB (undefined behavior)
Cool(std::string str, std::initializer_list<int> list)
: list_(list){} // UB
};
dix75
yndx-antoshkka
Готов помочь с написанием proposal.
yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).