shared_ptr и лямбда-захват

Мне трудно понять, как работает захват лямбда, в частности, как он перехватывает аргументы внутри лямбда. Я провел несколько часов, читая одни и те же тривиальные примеры о лямбдах, и до сих пор не понял.

Вот контекст. У меня есть узел класса:

class EventComparisonNode : public Node{ //or Date comparison node, only difference is instead of event there is Date struct
 public:
  EventComparisonNode(Comparison cmp, const std::string& event);
  bool Evaluate(const Date& date, const std::string& event) override; //Date struct contains ints
 private:
  Comparison cmp_; //it's enum
  std::string event_;
};

И у меня есть этот кусок кода

//ParseCondition returns shared_ptr<Node>
auto condition = ParseCondition(is);
auto predicate = [condition](const Date& date, const string& event) {
    return condition->Evaluate(date, event);
};

Вот мои вопросы:

Что такое предикат? Это какой-то пользовательский тип лямбда или что?

Во второй строке я фиксирую shared_ptr. Ok. Но откуда берутся даты, строки и типы? Я не вижу там ни структуры, ни переменной, ни чего-то еще, откуда это можно взять (и то, и другое одновременно). Переменные никуда не берутся.

Кстати, полный код доступен здесь: (не мой представитель)

https://github.com/freeraisor/yandexcplusplus/blob/master/2.%20Yellow/Final%20Project/main.cpp

Спасибо за Ваше внимание!


person Vasilii Naumushkin    schedule 03.02.2021    source источник
comment
Главный вопрос здесь может быть Что такое callable?. В качестве альтернативы, что такое лямбда? Что такое лямбда-захват?   -  person Drew Dormann    schedule 03.02.2021
comment
Лямбда — это сокращенный способ создания небольшого класса с переменными-членами (которые захватываются) и функцией с именем operator() (чтобы экземпляры класса могли вызываться, как если бы они были функцией). Аргументы для operator() такие же, как аргументы для вашей лямбды (const Date& date, const string& event)   -  person AndyG    schedule 03.02.2021
comment
IOW, auto predicate = [condition](const Date& date, const string& event) { return condition->Evaluate(date, event); }; примерно эквивалентно struct lambda_XYZ { shared_ptr<Node> condition; bool operator()(const Date& date, const string& event) const { return condition->Evaluate(date, event); }; lambda_XYZ predicate{condition};   -  person Remy Lebeau    schedule 03.02.2021