2014-12-31 9 views
8

Gdy funkcja przyjmuje argument według wartości, zazwyczaj może ją zmodyfikować. Jednak wydaje się, że nie jest tak w przypadku lambd. Czemu?Dlaczego argumenty lambda są przekazywane przez wartość tylko do odczytu w C++ 11?

int main() 
{ 
    int x = 0; 
    auto lambda = [x] { x = 1; }; // error: assignment of read-only variable ‘x’ 
    return 0; 
} 
+6

Domyślnie operatorem stosowania zamknięcia jest "const". Nadal możesz modyfikować przechwycone zmienne za pomocą 'mutable':' [x]() mutable {x = 1; } 'Zobacz także: http://stackoverflow.com/q/5501959 – dyp

Odpowiedz

4

Herb Sutter odpowiedział na pytanie here jak następuje;

Rozważmy przykład słoma człowieka, gdzie programator rejestruje zmienną lokalną wartością i próbuje modyfikować przechwycony wartości (która jest zmienną element obiektu lambda)

int val = 0; 
auto x = [=](item e)   // look ma, [=] means explicit copy 
      { use(e,++val); }; // error: count is const, need ‘mutable’ 
auto y = [val](item e)   // darnit, I really can’t get more explicit 
      { use(e,++val); }; // same error: count is const, need ‘mutable’ 

Ta funkcja prawdopodobnie została dodana z powodu obawy, że użytkownik może nie zdawać sobie sprawy, że dostał kopię, a w szczególności, ponieważ lambdas można kopiować, może on zmieniać nt kopii Lambda.

Uwaga: To jest dokument propozycji zmiany tej funkcji.

Powiązane problemy