C ++ 17 добавит захват копии этого объекта по значению, с спецификация захвата [*this]
.
Чем это полезно? Чем это отличается от захвата this
? Разве это не может быть достигнуто в C ++ 14 с [tmp = *this]
?
Бонус за объяснение почему P0018R3 использования [=, tmp = *this]
вместо [tmp = *this]
в их примере. Если бы они использовали [tmp = *this]
все перечисленные недостатки решения C ++ 14 будут устранены.
Чем это полезно? Это полезно, когда вам нужна копия *this
— например, когда *this
само по себе больше не действует к моменту оценки лямбды.
Как это отличается от захвата this
? Это делает копия объекта, так что, когда лямбда оценивается, его this
Указатель относится к копии, а не к исходному объекту.
Это может быть достигнуто в C ++ 14 с [tmp = *this]
? Может, но [*this]
удобнее, так как код может быть перемещен без префикса доступа члена к tmp.
, В противном случае, особенно с [=, tmp = *this]
можно случайно сослаться на члены исходного объекта, когда вы намеревались обратиться к копии (особенно, если вы привыкли к программированию «вырезать + вставить»). [=,*this]
является более безопасной альтернативой в этом случае, так как оригинал this
не доступен
Представь это *this
класс дескриптора, который поддерживает shared_ptr
в какое-то общее состояние.
Общий impl является (например) конечным автоматом обработчика протокола.
Класс дескриптора передается через серию асинхронных обработчиков, поэтому сам должен быть копируемым. Каждый обработчик изменяет общее состояние.
Сильный вариант использования для этого может быть обработчик протокола для использования с пользовательским asio
услуга (например, http_protocol_socket
).
[=, tmp = *this]
будет случайным образом фиксировать любые переменные по значению, в том числе, довольно опасно, this
сам указатель, а также конкретно захват *this
в tmp
,
В этом случае использования было бы опасно непреднамеренно обращаться к this
в асинхронном обработчике, потому что это может быть висячий указатель. Это ошибка, которая должна произойти.
[tmp=*this]
будет только захватывать *this
,