람다는 그 자리에서 만드는 함수 객체다. 알고리즘의 조건, 정렬의 비교, 콜백처럼 한 번 쓰는 동작에 맞다.
캡처
int limit = 10;
auto under = [limit](int v) { return v < limit; };
auto bump = [&limit] { ++limit; };`[limit]`는 값을 복사한다. `[&limit]`는 참조로 본다. `[=]`와 `[&]`처럼 기본 캡처는 무엇을 가져가는지 흐려지므로, 필요한 이름만 적는다. 복사를 람다 안에서 고치려면 매개변수 목록 뒤에 `mutable`을 붙인다. 그건 복사본을 고치는 것이지 바깥 변수를 고치는 것이 아니다.
저장이 필요할 때
람다를 `std::function`에 넣으면 서로 다른 호출 가능 객체를 한 타입으로 저장할 수 있다. 타입 소거에는 할당과 간접 호출 비용이 있을 수 있다. 템플릿 매개변수로 람다 타입을 그대로 받으면 그 비용이 없다.
제네릭 람다의 매개변수 `auto`는 호출마다 다른 타입을 받는다. C++20부터는 매개변수에 `auto` 대신 개념을 적어 제약을 걸 수 있다.
댓글
0개아직 댓글이 없습니다.