C ++ 17 лямбда-захват * это

C ++ 17 добавит захват копии этого объекта по значению, с спецификация захвата [*this].

Чем это полезно? Чем это отличается от захвата this? Разве это не может быть достигнуто в C ++ 14 с [tmp = *this]?


Бонус за объяснение почему P0018R3 использования [=, tmp = *this] вместо [tmp = *this] в их примере. Если бы они использовали [tmp = *this]все перечисленные недостатки решения C ++ 14 будут устранены.

25

Решение

Чем это полезно? Это полезно, когда вам нужна копия *this — например, когда *this само по себе больше не действует к моменту оценки лямбды.

Как это отличается от захвата this? Это делает копия объекта, так что, когда лямбда оценивается, его this Указатель относится к копии, а не к исходному объекту.

Это может быть достигнуто в C ++ 14 с [tmp = *this]? Может, но [*this] удобнее, так как код может быть перемещен без префикса доступа члена к tmp., В противном случае, особенно с [=, tmp = *this]можно случайно сослаться на члены исходного объекта, когда вы намеревались обратиться к копии (особенно, если вы привыкли к программированию «вырезать + вставить»). [=,*this] является более безопасной альтернативой в этом случае, так как оригинал this не доступен

24

Другие решения

Представь это *this класс дескриптора, который поддерживает shared_ptr в какое-то общее состояние.

Общий impl является (например) конечным автоматом обработчика протокола.

Класс дескриптора передается через серию асинхронных обработчиков, поэтому сам должен быть копируемым. Каждый обработчик изменяет общее состояние.

Сильный вариант использования для этого может быть обработчик протокола для использования с пользовательским asio услуга (например, http_protocol_socket).

[=, tmp = *this] будет случайным образом фиксировать любые переменные по значению, в том числе, довольно опасно, this сам указатель, а также конкретно захват *this в tmp,

В этом случае использования было бы опасно непреднамеренно обращаться к this в асинхронном обработчике, потому что это может быть висячий указатель. Это ошибка, которая должна произойти.

[tmp=*this] будет только захватывать *this,

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector