Powodem [&this]
nie działa, ponieważ jest to błąd składni. Każdy parametr oddzielone przecinkami w lambda-introducer
jest capture
:
capture:
identifier
& identifier
this
Widać, że nie jest dozwolone &this
składniowo. Powodem, dla którego nie jest to dozwolone, jest to, że nigdy nie chcesz przechwytywać this
przez odniesienie, ponieważ jest to mały wskaźnik const. Zawsze chciałbyś przekazać ją według wartości - więc język po prostu nie obsługuje przechwytywania this
przez odniesienie.
Aby przechwycić this
jawnie można użyć [this]
jako lambda-introducer
.
Pierwszy capture
może być capture-default
który jest:
capture-default:
&
=
oznacza wychwytywania automatycznie co użyć przez odniesienie (&
) lub wartości (=
), odpowiednio, - jednak leczenie this
jest szczególna - w obu przypadkach jest on przechwytywany przez wartość z powodów podanych wcześniej (nawet przy domyślnym przechwytywaniu &
, co zwykle oznacza przechwytywanie przez odniesienie).
5.1.2.7/8:
Dla celów wyszukiwania nazw (3.4), określenie rodzaju i wartości this
(9.3.2) i przekształcania id- wyrażenia odnoszące się do non-statycznych członków klasy w wyrażenia dostępu do członów klasy za pomocą (*this)
(9.3.1), , złożoną instrukcję [OF THE LAMBDA] rozpatruje się w kontekście wyrażenia lambda.
Więc lambda działa tak, jakby jest częścią otaczającej funkcji składowej przy użyciu nazwy elementu (jak w przykładzie użycia nazwy x
), więc będzie generować „ukryte zwyczaje” o this
podobnie jak funkcja członkowska ma.
Jeżeli lambda-capture zawiera przechwytywania-default, które jest &
, identyfikatory w lambda-wychwytywania nie będą poprzedzone &
.Jeżeli przechwytywanie lambda obejmuje domyślne ustawienie przechwytywania, to jest =
, przechwytywanie lambda nie może zawierać this
, a każdy jego identyfikator musi być poprzedzony przez &
. Identyfikator lub this
nie powinien pojawiać się więcej niż jeden raz w wychwycie lambda.
Więc można użyć [this]
, [&]
, [=]
lub [&,this]
jako lambda-introducer
uchwycić wskaźnik this
przez wartość.
Jednak [&this]
i [=, this]
są źle sformułowane. W ostatnim przypadku gcc wybacza ostrzegawczo dla [=,this]
, że zamiast błędów.
Po co miałbyś ochotę? Pod względem rzeczy, dla których odniesienie do wskaźnika może być w ogóle użyteczne: "tego" nie można zmienić, nie jest ono wystarczająco duże, aby odwołać się szybciej ... i ** tak czy inaczej **, _ it doesn ' t faktycznie istnieje, więc nie ma prawdziwego życia, co oznacza, że każde odniesienie do niego będzie zwisające z definicji. 'ten' jest prwartością, a nie lwartością. –