Ответ 1
Причина [&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 LAMBDA] рассматривается в контексте лямбда-выражения.
Итак, лямбда действует так, как если бы она была частью входящей функции-члена при использовании имен членов (например, в вашем примере использование имени 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
, а не ошибки.