즉석 함수 객체

람다는 캡처한 상태와 호출 코드를 묶어 알고리즘에 넘기는 객체다

람다 표현식은 짧은 함수처럼 보이지만 컴파일러가 이름 없는 함수 객체로 바꾼다. 그래서 상태를 담을 수 있고, STL 알고리즘에는 predicate나 action으로 전달된다.

문법을 네 칸으로 분해
[limit] 캡처 목록

외부 값을 값 또는 참조로 보관한다.

(const Person& p) 매개변수

호출될 때 들어오는 요소의 모양이다.

-> bool 반환형

필요할 때 결과 타입을 명시한다.

{ return p.age > limit; } 호출 본문

함수 객체의 operator()가 수행할 일이다.

1 외부 상태를 붙잡는다

캡처 목록이 비어 있으면 상태 없는 함수 객체에 가깝고, 값이 있으면 내부 멤버를 가진 객체가 된다.

값 복사 참조 연결 기본 캡처
2 호출 가능한 객체가 된다

컴파일러는 람다를 고유 타입의 객체로 보고, 본문은 호출 연산자 내부 코드처럼 다룬다.

closure operator() inline 후보
3 알고리즘에 조건을 주입한다

sort에는 비교 기준, for_each에는 반복 동작, find_if에는 찾을 조건을 짧게 전달한다.

sort for_each find_if