Вызов лямбда-функции, которая содержит лямбда-функцию
Пытаюсь понять как в этом коде вызывается лямбда-функция
auto vglambda = [](auto printer) {
return [=](auto&& ... ts) {
printer(std::forward<decltype(ts)>(ts)...);
};
};
auto p = vglambda( [](auto v1, auto v2, auto v3)
{ std::cout << v1 << v2 << v3; } );
p(1, 'a', 3.14); // OK: выводит 1a3.14
Как я думал , v1,v2,v3 должны передаваться в место ,где находится auto printer,но они ,как я понимаю, передаются в (auto&& ... ts),почему так происходит и что тогда передается в auto printer? Спасибо.
Ответы (1 шт):
Автор решения: Павел Ериков
→ Ссылка
vglambda - это лямбда, которая принимает лямбду и возвращает еще одну лямбду
[=](auto&& ... ts) в которой вызывается передаваемая лямбда.
То есть auto printer это лямбда, которую вы передаете:
[](auto v1, auto v2, auto v3) { std::cout << v1 << v2 << v3; }
И vglambda возвращает лямбду, которая вызовет передаваемую лямбду.
Когда вы пишите:
p(1, 'a', 3.14);
Вы вызываете лямбду (auto&& ... ts), которую возвращает лямбда vglambda, и которая в себе вызовет лямбду, которую вы передали на:
auto p = vglambda( [](auto v1, auto v2, auto v3)
{ std::cout << v1 << v2 << v3; } );