Причина [&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
це перше значення, а не значення.