в чем разница между [=] и [this]? - PullRequest
0 голосов
/ 27 мая 2020

В каком-то проекте найдено такое исправление:

-        use([=](Foo* &df) {
+        use([this](Foo* &df) {
             delete df;
             df = nullptr;
         });

где use это:

        template<class LAMBDA>
        void use(LAMBDA callback) {
            LOCK lock(this->mutex);
            callback(this->data);
        }

Что здесь происходит, почему [=] и [this] делают разница? Является ли this просто указателем, поэтому его следует копировать по значению, а [=] должен быть эквивалентен [this], или с [=] объект, на который указывает this, копируется по значению?

1 Ответ

1 голос
/ 27 мая 2020

this не является переменной (это ключевое слово). Таким образом, обычные правила захвата переменных не применяются. Оба параметра capture-defaults & и = захватывают объект, на который указывает this т.е. *this по ссылке. Начиная с C ++ 20, неявный захват *this при использовании = capture-default устарел.

Очевидное различие между использованием параметра capture-default и this состоит в том, что первое неявно захватывает любые локальные переменные, используемые в лямбде, а второе - нет.

В случае показанного лямбда, похоже, что он не использует никаких захватов, поэтому любое объявление захвата кажется избыточным.

...