Причина [&this]не працює, оскільки це синтаксична помилка. Кожен параметр, розділений комами, lambda-introducerє capture:
capture:
identifier
& identifier
this
Ви бачите, що &thisце не дозволено синтаксично. Причина, через яку це не дозволено, полягає в тому, що ви ніколи не захочете зробити знімок thisза допомогою посилання, оскільки це невеликий покажчик const. Ви хотіли б коли-небудь передавати його за значенням - тому мова просто не підтримує захоплення thisза допомогою посилання.
Для thisявного захоплення ви можете використовувати [this]як lambda-introducer.
Першим captureможе бути такий, capture-defaultякий:
capture-default:
&
=
Це означає, що я автоматично використовую те, що я використовую, за посиланням ( &) або за значенням ( =) відповідно - однак лікування thisє особливим - в обох випадках воно фіксується значенням з причин, зазначених раніше (навіть із захопленням за замовчуванням &, що зазвичай означає захоплення за допомогою посилання).
5.1.2.7/8:
Для пошуку імен (3.4), визначення типу та значення this(9.3.2) та перетворення виразів id, що посилаються на нестатичні члени класу, у вирази доступу членів класу за допомогою (*this)(9.3.1), складений вираз [OF ЛАМБДА] розглядається в контексті лямбда-виразу.
Отже, лямбда діє так, ніби вона є частиною функції, що включає член, при використанні імен членів (як у вашому прикладі використання імені x), тому вона буде генерувати "неявні звички", thisяк це робить функція-член.
Якщо лямбда-захоплення включає захоплення за замовчуванням, тобто &ідентифікатори в ламбда-захопленні не повинні передувати &. Якщо лямбда-захоплення включає захоплення за замовчуванням, тобто =, лямбда-захоплення не повинно містити,
thisі кожному ідентифікатору, який він містить, повинен передувати &. Ідентифікатор або thisне повинен з’являтися більше одного разу під час захоплення лямбда-сигналу.
Таким чином , ви можете використовувати [this], [&], [=]або [&,this]як lambda-introducerзахопити thisпокажчик на значення.
Однак [&this]і [=, this]погано сформовані. В останньому випадку gcc прощально попереджає про [=,this]це, explicit by-copy capture of ‘this’ redundant with by-copy capture defaultа не про помилки.
thisне може бути змінено, воно недостатньо велике, щоб зробити посилання швидшим ... і в будь-якому випадку , насправді воно не існує , тому воно є жодне реальне життя, тобто будь-яке посилання на нього буде звисати за визначенням.thisце перше значення, а не значення.