람다는 그 자리에서 만드는 함수 객체다. 알고리즘의 조건, 정렬의 비교, 콜백처럼 한 번 쓰는 동작에 맞다.

C++ 20. 람다와 함수 객체의 핵심 흐름도
그림. 람다 참조 캡처는 호출 시점까지 원본이 살아 있어야 한다.

캡처

int limit = 10;
auto under = [limit](int v) { return v < limit; };
auto bump = [&limit] { ++limit; };

`[limit]`는 값을 복사한다. `[&limit]`는 참조로 본다. `[=]`와 `[&]`처럼 기본 캡처는 무엇을 가져가는지 흐려지므로, 필요한 이름만 적는다. 복사를 람다 안에서 고치려면 매개변수 목록 뒤에 `mutable`을 붙인다. 그건 복사본을 고치는 것이지 바깥 변수를 고치는 것이 아니다.

저장이 필요할 때

람다를 `std::function`에 넣으면 서로 다른 호출 가능 객체를 한 타입으로 저장할 수 있다. 타입 소거에는 할당과 간접 호출 비용이 있을 수 있다. 템플릿 매개변수로 람다 타입을 그대로 받으면 그 비용이 없다.

제네릭 람다의 매개변수 `auto`는 호출마다 다른 타입을 받는다. C++20부터는 매개변수에 `auto` 대신 개념을 적어 제약을 걸 수 있다.