Inicializando std :: vector com chamadas de função iterativa

Em muitos idiomas, existem geradores que ajudam a inicializar as coleções. Em C ++, se alguém quiser inicializar um vetor uniformemente, pode escrever:

std::vector<int> vec(10, 42); // get 10 elements, each equals 42

E se alguém quiser gerar valores diferentes na hora? Por exemplo, inicializá-lo com 10 valores aleatórios ou números consecutivos de 0 a 9? Esta sintaxe seria conveniente, masnão funciona&nbsp;em C ++ 11:

int cnt = 0;
std::vector<int> vec(10, [&cnt]()->int { return cnt++;});

Existe uma maneira agradável de inicializar uma coleção por chamadas de função iterativa? Eu atualmente uso esse padrão feio (não muito mais legível / curto do que um loop):

std::vector<int> vec;
int cnt = 0;
std::generate_n(std::back_inserter(vec), 10, [&cnt]()->int { return cnt++;});

Há uma coisa que ajudaria e explicaria a falta do primeiro construtor. Eu posso imaginar um iterador que leva uma função e número de chamadas, para que o construtor

vector ( InputIterator first, InputIterator last);

seria aplicável. Mas eu não encontrei nada assim na biblioteca padrão. Eu senti falta disso? Existe outra razão pela qual o primeiro construtor não chegou ao padrão?