Warum wird C++11 lambda-Ausdruck benötigen "veränderlich" keyword " capture-by-Wert, per default?

Kurzes Beispiel:

#include <iostream>

int main()
{
    int n;
    [&](){n = 10;}();             //OK
    [=]() mutable {n = 20;}();    //OK
    //[=](){n = 10;}();          //Error: a by-value capture cannot be modified in a non-mutable lambda
    std::cout << n << "\n";       //"10"
}

Die Frage: Warum brauchen wir die mutable keyword? Es ist ganz anders als die traditionellen parameter der übergabe an benannten Funktionen. Was ist die Logik hinter?

War ich unter dem Eindruck, dass der ganze Sinn der capture-by-value ist, um dem Benutzer zu ermöglichen, ändern Sie den temporären -- sonst bin ich fast immer besser mit capture-by-reference, nicht wahr?

Jede Erleuchtung?

(Ich bin mit MSVC2010 durch die Art und Weise. AFAIK sollte dies standard sein)

Gute Frage; obwohl ich bin froh, dass etwas ist schließlich const standardmäßig!
Keine Antwort, aber ich denke, das ist eine sinnvolle Sache: wenn Sie etwas von Wert, Sie sollte nicht verändert werden, es ist nur zu sparen Sie 1 Kopie auf eine lokale variable. Zumindest werden Sie nicht den Fehler machen, zu ändern n durch ersetzen = mit &.
Nicht sicher, es ist gut, wenn alles andere nicht const standardmäßig.
Szelei: Nicht zu starten ein argument, aber IMHO das Konzept "einfach zu lernen" hat keinen Platz in der C++ - Sprache, vor allem in der modernen Tage. Sowieso 😛
"der ganze Sinn der capture-Wert wird, um dem Benutzer zu ermöglichen, ändern Sie den temporären" - Nein, der ganze Punkt ist, dass die lambda-Mai gültig bleiben über die Laufzeit eines aufgenommenen Variablen. Wenn C++ lambdas hatte nur capture-by-ref würde, wäre Sie unbrauchbar ist, viel zu viele Szenarien.

InformationsquelleAutor kizzx2 | 2011-03-31

Schreibe einen Kommentar