Почему я могу перехватить необъявленную переменную в изменяемой лямбде в C ++ - PullRequest
0 голосов
/ 30 мая 2018

Мы знаем, что в C ++ лямбда-выражения могут захватывать локальные переменные либо путем копирования (значения), либо путем ссылки, но почему я могу захватить переменную, которая нигде не объявлена ​​(не входит в объем)?Как стандарты определяют это поведение и какова мотивация этого выбора?

#include <iostream>
using namespace std;
int main()
{
    [pi=3.14]() mutable { 
       pi = 3.1415926; 
       cout << pi << endl; 
    }();
}

1 Ответ

0 голосов
/ 30 мая 2018

Когда лямбда-выражения были впервые представлены в C ++ 11, в них можно было записывать только существующие переменные.Однако это было расширено в более поздних итерациях стандарта, и теперь вы можете определять элементы для типа замыкания, не обязательно захватывая переменную.Это именно то, что вы делаете в своем примере.

Возможно, более распространенное использование для этой функции "захвата выражения" - это включение захвата только перемещаемых типов по значению:

std::unique_ptr<Foo> foo = whatever();
[p = std::move(foo)]() {
  p->bar();
}
...