Присвоение лямбды
#новичкам
Изучение лямбда выражений - не самая простая задача для начинающего плюсовика. Сложные термины, какие-то замыкания, списки захвата и прочее. В общем, непросто. И с виду можно подумать, что 2 одинаковые лямбды можно присваивать друг другу с легкостью. То есть может показаться, что такой код валидный:
int main() {
auto test = [](){};
test = [](){};
return 0;
}
Однако он генерирует примерно следующую ошибку:
Не нашел нужного оператора присваивания.
Да и вообще, это ж все лямбды, почему я не могу их присваивать друг другу?
Дело в том, что каждое отдельное лямбда-выражение генерирует свой тип, который называется замыканием. Только компилятор знает этот тип, вы его наружу никак не можете получить. Стандарт говорит:
Это легко проверить. Такой код выведет 0:
auto test = [](){};
auto test2 = [](){};
std::cout
#новичкам
Изучение лямбда выражений - не самая простая задача для начинающего плюсовика. Сложные термины, какие-то замыкания, списки захвата и прочее. В общем, непросто. И с виду можно подумать, что 2 одинаковые лямбды можно присваивать друг другу с легкостью. То есть может показаться, что такой код валидный:
int main() {
auto test = [](){};
test = [](){};
return 0;
}
Однако он генерирует примерно следующую ошибку:
In function ‘int main()’:
error: no match for ‘operator=’ in ‘test = main()::{}’
note: candidate is:
note: main()::& main()::::operator=(const main()::&)
no known conversion for argument 1 from ‘main()::’ to ‘const main()::&’
Не нашел нужного оператора присваивания.
Да и вообще, это ж все лямбды, почему я не могу их присваивать друг другу?
Дело в том, что каждое отдельное лямбда-выражение генерирует свой тип, который называется замыканием. Только компилятор знает этот тип, вы его наружу никак не можете получить. Стандарт говорит:
The type of the lambda-expression [...] is a unique, unnamed non-union class type — called the closure type.
Это легко проверить. Такой код выведет 0:
auto test = [](){};
auto test2 = [](){};
std::cout