La mia domanda: saremo in grado di costruire contenitori (esistenti) di librerie standard con qualsiasi intervallo? E, soprattutto, con le viste di portata?
No. L'unico componente di libreria standard che è costruibile da un intervallo arbitrario che soddisfa i criteri corretti è std::span<T>
.
La direzione con cui probabilmente andrà la libreria standard è quella verso cui va anche range-v3 (nota che l'esempio collegato di range-v3 viene compilato ma mette in guardia su una conversione deprecata) - usando un helper per fare conversioni per te:
std::vector<int> squares =
std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;
Uno dei motivi per non andare nella direzione dei costruttori di intervalli può essere visto proprio dall'esempio che stai usando:
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
Considera quanto è diversa quella dichiarazione da queste due:
std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );
v
sarebbe necessariamente un vector<transform_view<...>>
contenente un singolo transform_view
, mentre w
sarebbe un vector<int>
.
Inoltre, l'aggiunta di altri costruttori di container attentamente vincolati alla libreria standard non aiuterà comunque i tipi di container di terze parti, mentre una struttura come ranges::to
funziona perfettamente in tutti i casi.