Mi pregunta: ¿podremos construir contenedores de biblioteca estándar (existentes) con algún rango? Y lo más importante, ¿con vistas de rango?
No. El único componente de biblioteca estándar que es construible a partir de un rango arbitrario que cumple con los criterios correctos es std::span<T>
.
La dirección con la que probablemente irá la biblioteca estándar es hacia la que también se dirige range-v3 (tenga en cuenta que el ejemplo vinculado de range-v3 sí se compila pero advierte sobre una conversión en desuso): usar un ayudante para realizar conversiones por usted:
std::vector<int> squares =
std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;
Una de las razones para no ir en la dirección de los constructores de rango se puede ver desde el mismo ejemplo que está utilizando:
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
Considere cuán diferente es esa declaración de estos dos:
std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );
v
necesariamente sería un que vector<transform_view<...>>
contiene un solo transform_view
, mientras w
que sería un vector<int>
.
Además, agregar más constructores de contenedores cuidadosamente restringidos a la biblioteca estándar no ayudará a los tipos de contenedores de terceros de todos modos, mientras que una instalación como ranges::to
funciona perfectamente bien en todos los casos.