Moje pytanie: Czy będziemy w stanie zbudować (istniejące) kontenery biblioteki standardowej o dowolnym zakresie? A co ważniejsze, z widokami zasięgu?
Nie. Jedynym standardowym składnikiem biblioteki, który można zbudować z dowolnego zakresu, który spełnia poprawne kryteria, jest std::span<T>.
Kierunek, w którym prawdopodobnie pójdzie standardowa biblioteka, to ten, w którym zmierza również zakres v3 (zauważ, że połączony przykład z zakresu v3 kompiluje się, ale ostrzega przed przestarzałą konwersją) - używając pomocnika do wykonania konwersji dla Ciebie:
std::vector<int> squares =
std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;
Jednym z powodów, dla których nie należy iść w kierunku konstruktorów zasięgu, jest sam przykład, którego używasz:
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
Zastanów się, jak różni się ta deklaracja od tych dwóch:
std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );
vbyłoby koniecznie vector<transform_view<...>>zawierać singiel transform_view, podczas gdy wbyłoby vector<int>.
Co więcej, dodanie większej liczby starannie skonstruowanych konstruktorów kontenerów do standardowej biblioteki i tak nie pomoże żadnym innym typom kontenerów - podczas gdy takie obiekty ranges::todziałają doskonale doskonale we wszystkich przypadkach.