Przyczyna [&this]nie działa, ponieważ jest to błąd składniowy. Każdy parametr oddzielony przecinkami w tagu lambda-introducerto capture:
capture:
identifier
& identifier
this
Jak widać, &thisnie jest to dozwolone składniowo. Powodem, dla którego nie jest to dozwolone, jest to, że nigdy nie chciałbyś przechwytywać thisprzez 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 thisprzez odniesienie.
Aby przechwycić thisjawnie, możesz użyć [this]jako lambda-introducer.
Pierwszym capturemoże być a, capture-defaultktóry jest:
capture-default:
&
=
Oznacza to automatyczne przechwytywanie wszystkiego, czego używam, odpowiednio przez odniesienie ( &) lub wartość ( =) - jednak traktowanie thisjest 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”, thistak 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ć,
thisa każdy identyfikator, który zawiera, musi być poprzedzony znakiem &. Identyfikator lub thisnie powinien pojawiać się więcej niż jeden raz podczas przechwytywania lambda.
Więc można użyć [this], [&], [=]lub [&,this]jako lambda-introduceruchwycić thiswskaź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 defaultzamiast błędów.
thisnie 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.thisjest prwartością, a nie lwartością.