Iterieren über einen Vektor funktioniert:
%Vor%aber nicht über einen Satz (Kompilierfehler):
%Vor% Warum kann ich nicht über ein std::set
mit std::for_each
iterieren?
Bonusfrage:
Außerdem möchte ich das int&
im Argument von Lambda zu auto&
ändern, warum kann dies nicht automatisch abgeleitet werden?
std::set<T>::value_type
ist T const
, nicht T
; Folglich muss das Argument für Ihr Lambda ein Werttyp sein (d. h. Kopie) oder int const&
(und technisch oder int const volatile&
), nicht int&
. Das heißt, das funktioniert:
Bonus Frage: Außerdem würde ich gerne das
int&
im Argument von Lambda inauto&
ändern, warum kann das nicht automatisch abgeleitet werden?
Weil der Standard sagt, dass es nicht möglich ist; Historisch gesehen war dies auf übermäßig komplizierte Interaktionen zwischen lambdas und Konzepten zurückzuführen (bevor die Konzepte aus dem Entwurf entfernt wurden). Ich höre jedoch Gerüchte, dass der erste Fehler, der an den neuen (C ++ 11) Standard berichtet, genau dies angeht, also ist es möglich, dass Sie innerhalb des nächsten Jahres Unterstützung für diesen zusätzlichen Compiler Ihrer Wahl erhalten zwei. BEARBEITEN : Oh, schau, C ++ 14 hat jetzt polymorphe Lambdas ...
Zur Bonusfrage: Ein "auto" -Funktionsargument ist nicht spezifisch für Lambdas. Sie können sich auch fragen, warum wir alle Funktionen nicht als f(auto x, auto y)
deklarieren dürfen. Das bedeutet aber im Wesentlichen, dass Sie alle Funktionen durch Funktionsschablonen ersetzen wollen. Dies wurde als nicht gut mit der bestehenden C ++ - Sprache und insbesondere dem Typsystem angesehen. Wenn Sie eine Funktionsvorlage haben möchten, gibt es bereits eine bestehende Syntax und einen Mechanismus, und das Erklären von "automatischen" Argumenten ist nicht der richtige Weg.
Ein dereferenzierter set<int>
Iterator ist ein const int&
. Sie können es also nicht als int&
-Parameter ohne const
übergeben. Probieren Sie entweder einfach (int i)
oder (const int& i)
.
Und das ist wirklich nicht einer der Orte, an denen du auto
benutzen darfst. Ich denke auto
funktioniert nur in einer Deklaration mit Initialisierer oder als Platzhalter für einen abschließenden Rückgabetyp.
Sie sollten in der Lage sein, über eine Menge zu iterieren. Beachten Sie jedoch, dass das Element in einem Set auch sein Schlüssel ist und daher nicht geändert werden kann. Ändern Sie Ihren Code so, dass er eine const
-Referenz verwendet, und verwenden Sie stattdessen cbegin/cend
, unabhängig davon, ob eine Menge gesetzt ist oder nicht, wenn Sie die Elemente nicht ändern.