Lambda

람다는 가까운 곳에 둔 작은 함수 객체다

람다 표현식은 알고리즘 호출부에 조건과 변환을 붙여 준다. 캡처 방식과 수명이 맞지 않으면 짧은 코드가 긴 버그를 만든다.

01

캡처 목록을 좁힌다

[&]나 [=] 대신 필요한 이름만 적으면 수명과 의존성이 보인다.

02

호출 위치 검토

즉시 실행되는 알고리즘 predicate인지, 나중에 저장되어 호출될 callback인지 구분한다.

03

길이를 제한한다

람다 본문이 여러 책임을 가지면 이름 있는 함수나 함수 객체로 뺀다.

[x]
값 캡처 현재 값을 복사해 람다 객체 안에 보관한다.
복사 비용과 stale value를 본다.
[&x]
참조 캡처 원본을 가리키므로 원본 수명이 람다보다 길어야 한다.
비동기 callback에서 특히 위험하다.
generic
auto parameter 템플릿 같은 operator()를 가진 람다가 된다.
타입 요구 조건이 흐릴 수 있다.
mutable
값 캡처 변경 람다 내부의 복사본을 바꾸며 원본은 바꾸지 않는다.
의도한 변경 대상인지 확인한다.

참조 수명 · 캡처 범위 · 본문 크기 점검

참조 수명 람다가 함수 밖에 저장되거나 스레드로 넘어가는데 지역 변수를 참조하지 않는가.
캡처 범위 기본 캡처가 필요 없는 객체까지 잡아 결합을 키우지 않는가.
본문 크기 조건식보다 도메인 로직이 길다면 이름 있는 함수가 더 나은가.

명시 캡처

const int limit = 80;
auto passed = std::count_if(scores.begin(), scores.end(), [limit](int score) {
    return score >= limit;
});