In der folgenden Funktion kann ich auf der erfassten Variable ‚bestellen‘ verlassen auf dem neuesten Stand sein, das heißtWann werden Lambda-Captures initialisiert?
- Wird die Funktion immer wie erwartet?
- Gibt es einen Unterschied zwischen der Erfassung nach Wert oder Referenz.
- Ist die Funktion reentrant?
struct Entry
{
std::string name;
double earnings;
};
enum Column { Name, Earnings };
enum SortOrder { Ascending, Descending };
void sortByColumn(std::vector<Entry>& entries, Column column, SortOrder order)
{
std::function<bool(const Entry&, const Entry&)> comparators[] =
{
[&](const Entry& a, const Entry& b) { return order==Ascending ?
a.name < b.name : a.name > b.name; },
[=](const Entry& a, const Entry& b) { return order==Ascending ?
a.earnings < b.earnings : a.earnings > b.earnings; }
};
std::sort(entries.begin(), entries.end(), comparators[column]);
}
Sie ein vollständiges Beispiel finden Sie hier: http://coliru.stacked-crooked.com/a/240b74d1706a1b6f
Mögliches Duplikat von [In C++ 11, wann sollen die gebundenen Variablen eines Lambda-Ausdrucks als Wert erfasst werden?] (Http://stackoverflow.com/questions/7881149/in-c11-when-are) -a-Lambda-Ausdrücke-gebunden-Variablen-angenommen-zu-gefangen-werden –
@JamesElderfield Ich würde argumentieren, dass dies kein Dupe zu der verknüpften Frage ist, da es über MSVC Verhalten fragt. Die Antworten sind sachdienlich, aber die Frage selbst ist keine Täuschung. –