лямбда: перехват `this` с удаленным оператором присваивания выдает предупреждение компилятора - PullRequest
0 голосов
/ 21 сентября 2019

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

#pragma warning(default : 4626)
struct B{
  B& operator=(const B&) = delete;
  void f(){
    auto l = [this](){ // <== compiler warning
      /*body*/
    };
  }
};

int main(){
  return 0;
}

Приведенный выше код вызывает следующее предупреждение вMSVC 2019 (16.2.5):

предупреждение C4626: 'B :: f ::': оператор присваивания был неявно определен как удаленный

Предупреждение выводится для лямбды, которая захватывает this (и если я не фиксирую this, он компилируется без предупреждений).

Может ли кто-нибудь объяснить мне причину предупреждения, и если есть способ написать код так, чтобы он компилировался чисто?

Я понимаю, что операторы присваивания лямбда-выражений неявно удаляются, но не уверен, как(если) имеет отношение к полученному предупреждению.

1 Ответ

0 голосов
/ 26 сентября 2019

Я в аналогичной ситуации и воспроизвел предупреждение следующим образом:

#pragma warning(default : 4626)

struct A
{
  A& operator=(const A&) = delete;
};

struct B : public A
{
  //B& operator=(const B&) = delete;
  void f(){
    auto l = [](){ // <== compiler warning
      /*body*/
    };
  }
};

int main(){
  return 0;
}

Скомпилировано с /std:c++latest /W4, в моем случае не имеет значения, если вы захватите это или нет.

ЕстьВы наследуете класс от другого класса с удаленным оператором =?Я избегаю этого предупреждения, явно удаляя оператор = в моем случае.Это предупреждение произошло в MVS 19 16.3.0 при компиляции с / latest.с / std: c ++ 17 такого предупреждения нет.

EDIT

это предупреждение также происходит, как только что-то, захваченное в lamdba, используется (перехвачено копиейили ссылка не имеет значения):

#pragma warning(default : 4626)

int main()
{
    int foo;
    auto bar = [&]() {
        foo;
    };

  return 0;
}

<source>(8): warning C4626: 'main::<lambda_1>': assignment operator was implicitly defined as deleted

(с / std: c ++ latest / W4)

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