Обычно вы можете думать о лямбда как эквивалент этого:
class ANON {
int data;
public:
void operator()(void) const {
cout << data << endl;
}
} lambda;
// auto lambda = [data]() {cout << data << endl;}
Это должно дать вам представление о том, как осуществляется захват. Захват всех (будь то копией =
или ссылкой &
), вероятно, будет не более чем синтаксическим сахаром для указания всех используемых/доступных переменных для захвата в текущей области.
Но с тех пор ...
[..] Реализация может определить тип закрытия отличается от того, что описано ниже, если это не изменяет наблюдаемого поведения программы, кроме путем изменения: [. .] размер и/или выравнивание типа закрытия [..]
[N4431 §5.1.2/3]
... это было бы законно реализация использовать какой-то «черная магия» для захвата всеми ссылочными лямбдами и просто использовать указатель на захваченный кадр стеки, переписывание доступы к переменным, как доступу к некоторому смещению этого указателя:
class ANON {
void * stack_frame;
public:
void operator()(void) const {
cout << *static_cast<int *>(stack_frame + 8) << endl;
}
} lambda;
Так, используя &
мощи (некоторый день) быть более эффективными, но, как уже сказал, что это реализация определена, и на это не на что положиться.
осуществление определено. нет правильного ответа. если производительность является проблемой, переосмыслите алгоритм. –
'&' вероятно, имеет тот же эффект, что и явный захват всего, что вы на самом деле используете, поэтому оно не будет быстрее. – Brian
Обратите внимание, что с глобальным захватом '[&]' вы будете захватывать 'this' по ссылке и потенциально вводит другое косвенное направление. – Jarod42