Przyczyna [&this]
nie działa, ponieważ jest to błąd składniowy. Każdy parametr oddzielony przecinkami w tagu lambda-introducer
to capture
:
capture:
identifier
& identifier
this
Jak widać, &this
nie jest to dozwolone składniowo. Powodem, dla którego nie jest to dozwolone, jest to, że nigdy nie chciałbyś przechwytywać this
przez odniesienie, ponieważ jest to mały wskaźnik do stałej. Zawsze chciałbyś przekazać to tylko według wartości - więc język po prostu nie obsługuje przechwytywania this
przez odniesienie.
Aby przechwycić this
jawnie, możesz użyć [this]
jako lambda-introducer
.
Pierwszym capture
może być a, capture-default
który jest:
capture-default:
&
=
Oznacza to automatyczne przechwytywanie wszystkiego, czego używam, odpowiednio przez odniesienie ( &
) lub wartość ( =
) - jednak traktowanie this
jest specjalne - w obu przypadkach jest ujmowane według wartości z powodów podanych wcześniej (nawet przy domyślnym przechwytywaniu &
, co zwykle oznacza przechwytywanie przez odniesienie).
5.1.2.7/8:
Na potrzeby wyszukiwania nazw (3.4), określenia typu i wartości this
(9.3.2) oraz przekształcenia wyrażeń id odnoszących się do niestatycznych składowych klasy do wyrażeń dostępu do (*this)
składowych klasy przy użyciu (9.3.1), instrukcja złożona [OF LAMBDA] rozpatruje się w kontekście wyrażenia lambda.
Zatem lambda zachowuje się tak, jakby była częścią otaczającej funkcji składowej, gdy używa się nazw składowych (tak jak w twoim przykładzie użycie nazwy x
), więc wygeneruje „niejawne zastosowania”, this
tak jak robi to funkcja składowa.
Jeśli przechwytywanie lambda zawiera domyślne ustawienie przechwytywania, to &
identyfikatory w przechwytywaniu lambda nie powinny być poprzedzone znakiem &
. Jeżeli przechwytywanie lambda obejmuje domyślne wychwytywanie, to znaczy =
przechwytywanie lambda nie może zawierać,
this
a każdy identyfikator, który zawiera, musi być poprzedzony znakiem &
. Identyfikator lub this
nie powinien pojawiać się więcej niż jeden raz podczas przechwytywania lambda.
Więc można użyć [this]
, [&]
, [=]
lub [&,this]
jako lambda-introducer
uchwycić this
wskaźnik przez wartość.
Jednak [&this]
i [=, this]
są źle ukształtowane. W tym ostatnim przypadku gcc forgivingly dla ostrzega [=,this]
, że explicit by-copy capture of ‘this’ redundant with by-copy capture default
zamiast błędów.
this
nie może być zmieniony, nie jest wystarczająco duży, aby odniesienie szybciej ... i mimo to , że w rzeczywistości nie istnieje , a więc ma żadne prawdziwe życie, co oznacza, że jakiekolwiek odniesienie do niego byłoby z definicji zwisające.this
jest prwartością, a nie lwartością.