В этом фрагменте я объявляю переменную i
внутри лямбда-захвата.
int main()
{
vector<int> vec;
// Pushing 0-99 numbers to vector
std::generate_n(std::back_inserter(vec), 100, [i = 0]() mutable { return i++; });
return 0;
}
Как видно, нигде не указано типа для i
.
Насколько я знаю, я могу написать эквивалентную функциональность следующим образом:
int main()
{
vector<int> vec;
// Pushing 0-99 numbers to vector
std::generate_n(std::back_inserter(vec), 100, [](){
static int i = 0;
return i++; });
return 0;
}
Как компилятор узнает тип i
в первом примере? Выведено ли оно из операции, которую я выполняю на нем (++)? Знает ли он, что это int
из-за контейнера?
Нет никаких претензий при компиляции с G CC с -std = c ++ 14 и -std = c ++ 17. Тем не менее, если я скомпилирую с -std = c ++ 11, я получу следующее предупреждение:
lambda_test.cpp: In function ‘int main()’:
lambda_test.cpp:24:51: warning: lambda capture initializers only available with -std=c++14 or -std=gnu++14
std::generate_n(std::back_inserter(first), 100, [i = 0]() mutable { return i++; });
^
MORE : учитывая комментарии, я попытался увидеть разницу в том, что компилятор производит для c ++ 11 и 14, но генерирует тот же код: https://cppinsights.io/s/43411e6f