C ++ лямбда, как глубоко в нем находится пункт захвата - PullRequest
0 голосов
/ 04 июля 2018

Когда у меня есть функция обратного вызова, как это:

using MessageCallback =
    std::function<void(const Message &, uint64_t deliveryTag, bool redelivered)>;

Я мог бы объявить статическую функцию обратного вызова внутри класса:

static void MessageCB(const AMQP::Message &message,
                      uint64_t deliveryTag,
                      bool redelivered)
{...}

Но я не могу получить доступ к переменным-членам внутри этой функции обратного вызова.

Когда я пишу лямбда-функцию следующим образом:

 auto MessageCB= [&](const AMQP::Message &message,
                      uint64_t deliveryTag,
                      bool redelivered)
 {...}

Затем я мог бы использовать любые переменные-члены из контекста, где я объявил лямбду.

Как это работает? Как именно работает пункт захвата?

В чем отличие статической функции обратного вызова?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Нет, я не понимаю, как его использовать, но я хочу понять, как Lamda разрешает доступ к предложению capure. Что является эквивалентом в с ++ 03? Как я мог переписать лямду со статическим обратным вызовом функционировать? - selbolder

Посмотрите на Bind Bind

А здесь

0 голосов
/ 04 июля 2018

Эта справочная страница cpp объясняет, как формируются лямбда-выражения, следующее из раздела captures (мой акцент):

[&] захватывает все автоматические переменные, используемые в теле лямбды по ссылке, и текущий объект по ссылке, если существует

Если вы спрашиваете конкретно, как компилятор захватывает переменные при объявлении их в лямбда-выражениях, тогда этот является полезным ресурсом. С этой страницы:

Когда вы добавляете список захвата в лямбду, компилятор добавляет соответствующие переменные-члены в класс лямбда-функтора и конструктор для инициализации этих переменных. enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...