Minha pergunta: Seremos capazes de construir contêineres de biblioteca padrão (existentes) com qualquer intervalo? E mais importante, com vistas de alcance?
Não. O único componente da biblioteca padrão que é construtível a partir de um intervalo arbitrário que atende aos critérios corretos é std::span<T>
.
A direção que a biblioteca padrão provavelmente seguirá é a que o range-v3 também está seguindo (observe que o exemplo vinculado do range-v3 é compilado, mas avisa sobre uma conversão obsoleta) - usando um auxiliar para fazer conversões para você:
std::vector<int> squares =
std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;
Um dos motivos para não seguir a direção dos construtores de intervalo pode ser visto no próprio exemplo que você está usando:
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
Considere o quão diferente é essa declaração dessas duas:
std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );
v
seria necessariamente um vector<transform_view<...>>
contendo um único transform_view
, enquanto w
seria um vector<int>
.
Além disso, adicionar mais construtores de contêineres cuidadosamente restritos à biblioteca padrão não ajudará de qualquer maneira os tipos de contêineres de terceiros - enquanto uma instalação como ranges::to
funciona perfeitamente bem em todos os casos.