Wyrażenie lambda istnieje w celu uproszczenia kodu. To:
auto fun = []() { return; };
Czy zastąpiony przez kompilator z:
// Namespace scope
struct __lambda_1 {
void operator()() { return; }
};
// local scope
__lambda_1 fun{};
To jest główną motywacją do składni lambda: Aby zastąpić tradycyjny funkcja obiektów z łatwiejsze do odczytania funkcję anonimową zadeklarowanej w miejscu, gdzie jest potrzebna, zamiast mieć oddzielny obiekt funkcji, który musi być zadeklarowany w innym zakresie. Nie chodzi tylko o zastąpienie nazwanych obiektów funkcji.
Rzeczywiście, biblioteka standardowa zawiera wiele nazwanych obiektów funkcji, takich jak std::unary_function
i rzeczy takie jak std::less
. Jednak obiekty te mają ograniczoną użyteczność i nie mogą przejąć każdej potencjalnej roli, jaką mogłaby osiągnąć lambda.
Tak, może sprawić, że kod będzie znacznie bardziej czytelny, umieszczając kod, którego standardowa biblioteka nie zapewnia dokładnie tam, gdzie jest to wymagane, bez zanieczyszczania kodu dziesiątkami linii struct
s i zanieczyszczania przestrzeni nazw nazwami " Prawdopodobnie użyjesz nie więcej niż raz lub dwa razy.
Wersja lambda nie jest dłuższa. Nie-lambda jest niekompletna, ponieważ nie mamy definicji "Less_than". –
Jak to jest, że 'Less_than (x)' a "normalna definicja funkcji" ?? Sądząc po twoim pierwszym przykładzie, wygląda na to, że musisz związać wartość 'x' z dwufunkcyjnym funktorem komparatora, konwertując go do komparatora jednoparametrowego. To już funkcjonalność, która wykracza znacznie poza "normalną definicję funkcji". –
AnT