2012-10-20 12 views
10

mi chiedo perché = modalità cattura-default vieta this in cattura-list di C++ un'espressione lambda.restrizione sulla modalità di acquisizione predefinita e 'questo' in C++ lambda-espressione

Cioè,

[=, this]{ }; // error 
[&, this]{ }; // OK 

viene specificato dal C++ 11 5.1.2/8.

  • Se un lambda-acquisizione include una cattura-default che è &, i identificatori della lambda-capture non è preceduta da &.
  • Se un'acquisizione lambda include un'acquisizione-default =, la lambda-capture non deve contenere questo e ogni identificatore che contiene deve essere preceduto da &.

D: C'è qualche motivo o storia di fondo per questa regola?

+1

non è 'this' implicitamente catturati in ogni caso quando la cattura-default è '='? – Benj

+0

@Benj Sì, 'this' è implicitamente catturato con' = 'e' & 'capture-default. – yohjp

+1

Mi chiedo se "questo" sia in realtà sempre catturato dal riferimento indipendentemente dal valore predefinito. – Benj

risposta

9

this può essere acquisito solo tramite copia e mai per riferimento. Anche se si specifica solo [&], this può essere catturato implicitamente dalla copia se usato odr. Pertanto, [=, this] è un errore perché = sarebbe già implicitamente catturare this dalla copia mentre il & in [&, this] significa cattura da riferimento e non significa implicitamente catturare this (a meno che sia ODR-usato)

+0

Sono un po 'confuso. Non '[&]' (non '[&, this]') acquisisce implicitamente 'this'? – yohjp

+1

No, '[&]' non acquisisce implicitamente 'questo' per impostazione predefinita. ** Tuttavia **, se usi odr "questo" all'interno delle parentesi graffe "{}" come quando accedi a una variabile membro, ecc. ** allora ** viene catturato implicitamente da '[&]' (ma esso * ancora * viene catturato dalla copia e non dal riferimento). –

+0

Grazie per la spiegazione, ho capito. – yohjp

Problemi correlati