C ++ 0x Lambda-Erfassung nach Wert immer const?

102

Gibt es eine Möglichkeit, nach Wert zu erfassen und den erfassten Wert nicht konstant zu machen? Ich habe einen Bibliotheks-Funktor, den ich erfassen und eine Methode aufrufen möchte, die nicht konstant ist, aber sein sollte.

Das Folgende wird nicht kompiliert, aber foo :: operator () const behebt es.

struct foo
{
  bool operator () ( const bool & a )
  {
    return a;
  }
};


int _tmain(int argc, _TCHAR* argv[])
{
  foo afoo;

  auto bar = [=] () -> bool
    {
      afoo(true);
    };

  return 0;
}
Zac
quelle

Antworten:

165

Verwenden Sie veränderlich.


auto bar = [=] () mutable -> bool ....

Ohne veränderlich deklarieren Sie den Operator () des Lambda-Objekts const.

Edward Strange
quelle
-5

Es gibt eine alternative Möglichkeit zur Verwendung von veränderlichen (von Crazy Eddie vorgeschlagene Lösung).

Mit [=] erfasst Ihr Block alle Objekte nach Werten. Mit [&] können Sie alle Objekte nach Referenz erfassen:

auto bar = [&] () -> bool

Oder Sie können nur bestimmte Objekte [=, & afoo] als Referenz erfassen :

auto bar = [=, &afoo] () -> bool

Weitere Informationen finden Sie auf dieser Seite ( Erläuterungsabschnitt ): http://en.cppreference.com/w/cpp/language/lambda

Vlad
quelle
11
Das macht ganz andere Dinge. Sie sind nicht austauschbar. Dies beantwortet nicht die Frage des OP.
Edward Strange
1
Das Problem dieser Lösung besteht darin, dass sie nicht für erfasste lokale Variablen funktioniert, die vor der Ausführung des Lambda zerstört wurden (z. B. wenn Sie einen getrennten std :: thread starten).
Simon Ninon