Мой вопрос: сможем ли мы создать (существующие) контейнеры стандартной библиотеки с любым диапазоном? И что еще важнее, с диапазоном просмотров?
Нет. Единственный стандартный компонент библиотеки, который может быть сконструирован из произвольного диапазона и соответствует правильным критериям std::span<T>
.
Скорее всего, в этом направлении будет идти стандартная библиотека, к которой также направляется range-v3 (обратите внимание, что связанный пример из range-v3 компилируется, но предупреждает об устаревшем преобразовании) - используя помощника для выполнения преобразований за вас:
std::vector<int> squares =
std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;
Одна из причин не идти в направлении конструкторов диапазона может быть замечена из самого примера, который вы используете:
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
Посмотрите, насколько эта декларация отличается от этих двух:
std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );
v
будет обязательно vector<transform_view<...>>
содержать один transform_view
, аw
будет vector<int>
.
Более того, добавление в стандартную библиотеку дополнительных, тщательно ограниченных конструкторов контейнеров в любом случае не поможет сторонним типам контейнеров - в то время как подобный объект ranges::to
работает превосходно во всех случаях.