Ma question: serons-nous en mesure de construire des conteneurs de bibliothèque standard (existants) avec n'importe quelle gamme? Et plus important encore, avec des vues de portée?
Non. Le seul composant de bibliothèque standard pouvant être construit à partir d'une plage arbitraire répondant aux critères appropriés est std::span<T>
.
La direction dans laquelle la bibliothèque standard ira probablement est celle vers laquelle range-v3 va également (notez que l'exemple lié de range-v3 se compile mais met en garde contre une conversion obsolète) - en utilisant un assistant pour effectuer des conversions pour vous:
std::vector<int> squares =
std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;
Une des raisons de ne pas aller dans le sens des constructeurs de plage peut être vue dans l'exemple même que vous utilisez:
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
Considérez à quel point cette déclaration est différente de ces deux:
std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );
v
serait nécessairement un vector<transform_view<...>>
contenant un seul transform_view
, tandis que w
serait un vector<int>
.
De plus, l'ajout de constructeurs de conteneurs plus restreints avec soin à la bibliothèque standard ne va de toute façon pas aider les types de conteneurs tiers - alors qu'une installation comme ranges::to
fonctionne parfaitement dans tous les cas.