O motivo pelo qual [&this]
não funciona é porque é um erro de sintaxe. Cada parâmetro separado por vírgula no lambda-introducer
é um capture
:
capture:
identifier
& identifier
this
Você pode ver que isso &this
não é permitido sintaticamente. O motivo pelo qual não é permitido é porque você nunca deseja capturar this
por referência, pois é um pequeno ponteiro const. Você só gostaria de passá-lo por valor - então, a linguagem simplesmente não suporta a captura this
por referência.
Para capturar this
explicitamente, você pode usar [this]
como o lambda-introducer
.
O primeiro capture
pode ser um capture-default
que é:
capture-default:
&
=
Isso significa capturar automaticamente tudo o que eu uso, por referência ( &
) ou por valor ( =
) respectivamente - no entanto, o tratamento de this
é especial - em ambos os casos é capturado por valor pelas razões dadas anteriormente (mesmo com uma captura padrão de &
, o que geralmente significa captura por referência).
5.1.2.7/8:
Para fins de pesquisa de nome (3.4), determinar o tipo e valor de this
(9.3.2) e transformar expressões id referentes a membros de classe não estáticos em expressões de acesso de membros de classe usando (*this)
(9.3.1), a instrução composta [OF O LAMBDA] é considerado no contexto da expressão lambda.
Portanto, o lambda atua como se fosse parte da função de membro envolvente ao usar nomes de membro (como em seu exemplo o uso do nome x
), então ele irá gerar "usos implícitos" this
exatamente como faz uma função de membro.
Se uma captura lambda inclui um padrão de captura, isto é &
, os identificadores na captura lambda não devem ser precedidos por &
. Se uma captura lambda inclui um padrão de captura, isto é =
, a captura lambda não deve conter
this
e cada identificador que contém deve ser precedido por &
. Um identificador ou this
não deve aparecer mais de uma vez em uma captura lambda.
Assim você pode usar [this]
, [&]
, [=]
ou [&,this]
como um lambda-introducer
para capturar othis
ponteiro por valor.
No entanto [&this]
e [=, this]
estão mal formados. No último caso, o gcc avisa com perdão sobre [=,this]
isso explicit by-copy capture of ‘this’ redundant with by-copy capture default
ao invés de erros.
this
não pode ser alterado, não é grande o suficiente para tornar uma referência mais rápida ... e de qualquer forma , ele não existe de fato , então nenhuma vida real, o que significa que qualquer referência a ele estaria pendente por definição.this
é um prvalue, não um lvalue.