Почему будущая библиотека Ranges не поддерживает инициализацию контейнера из диапазона? - PullRequest
2 голосов
/ 02 мая 2019

Введение

С появлением библиотеки Ranges необходимость в обозначении диапазона двумя итераторами практически исчезла.Например, вместо

if (std::equal(begin(foo), end(foo), begin(bar), end(bar)))

мы имеем

if (std::ranges::equal(foo, bar))

Последний, вероятно, превосходит не только из-за его краткости, но также потому, что он предотвращает общую ловушку пропуска end(bar)и приветствуя связанные ошибки.

Задача

Как насчет следующего кода?

std::vector<int> vec{begin(foo), end(foo)};

, где foo - диапазон.С Ranges я бы ожидал упростить его до

std::vector<int> vec{foo};

Однако я не могу найти упоминания об этом в [vector] или [container.requirements] .Также библиотека Ranges не представляет новый набор контейнеров.

Почему библиотека Ranges не поддерживает инициализацию контейнера из диапазона?Каково обоснование?

Ответы [ 2 ]

6 голосов
/ 02 мая 2019

Целью C ++ 20 было получение диапазонов!Было несколько препятствий, которые нужно было преодолеть, прежде чем это могло произойти, но, как только они были преодолены, вполне вероятно, что комитет счел, что лучше всего ввести работоспособную библиотеку диапазонов, которая, возможно, не завершена, вместо диапазонов вообще.

Это не означает, что эта функция нежелательна, только то, что остались только некоторые открытые вопросы относительно нее, но она все еще находится в разработке (см. p1206 ).

Если кто-то читаетВ обосновании пересмотра 1 статьи упоминается, что добавление конструкторов в стандартные контейнеры оказалось неосуществимым.Скорее всего, потому что стандартные контейнеры так сильно модифицированы при инициализации, что разрешение перегрузки становится кошмаром.

0 голосов
/ 02 мая 2019

Вектор и другие контейнеры уже имеют конструктор, который принимает initializer_list. Таким образом, std::vector<int> vec{foo} вызывает конструктор initializer_list и означает «построить вектор с foo в качестве элемента». Ваш предложенный синтаксис будет конфликтовать.

Это не обязательно означает, что это невозможно; но это означает, что существует взаимодействие с API, которое уже существует и имеет проблемы с обратной совместимостью, и это замедлит стандартизацию и усложнит процесс голосования.

...