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) );
v
byłoby koniecznie vector<transform_view<...>>
zawierać singiel transform_view
, podczas gdy w
był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::to
działają doskonale doskonale we wszystkich przypadkach.