Вызов лямбда-функции, которая содержит лямбда-функцию

Пытаюсь понять как в этом коде вызывается лямбда-функция

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; } );
→ Ссылка