Ad esempio:regola per la variabile cattura lambda
class Example
{
public:
explicit Example(int n) : num(n) {}
void addAndPrint(vector<int>& v) const
{
for_each(v.begin(), v.end(), [num](int n) { cout << num + n << " "; });
}
private:
int num;
};
int main()
{
vector<int> v = { 0, 1, 2, 3, 4 };
Example ex(1);
ex.addAndPrint(v);
return 0;
}
Quando si compila e si esegue questo in MSVC2010 si ottiene il seguente errore:
errore C3480: 'Esempio :: num': una cattura lambda variabile deve essere da un insieme di funzioni di inclusione
Tuttavia, con g ++ 4.6.2 (prerelease) si ottiene:
Quale compilatore ha ragione secondo la bozza standard? dice
Si noti che è necessario acquisire 'this' per valore qui, non' num'. Quando usi 'num', stai veramente usando' this-> num'. Si noti inoltre che MSVC non implementa la dicitura C++ 11 di lambda, poiché è cambiata dopo il 2008, quando hanno implementato tutto questo. –
@Alexandre: Catturare 'this' è effettivamente lo stesso di catturare' num' per riferimento. Questo sembra non essere ciò che si desidera qui. –
@ Ben: buon punto. Comunque il risultato è lo stesso qui, poiché la chiusura non sfugge all'ambito di 'addAndPrint' (e l'intera faccenda dovrebbe comunque essere inserita qui). 5.1.2 come citato da @dimitri sembra indicare che MSVC ha ragione, dato che 'num' non è una variabile con durata di archiviazione automatica. Questo comportamento è piuttosto strano comunque. –