람다 캡처 계약

람다 캡처 수명

람다는 짧게 쓰여도 실제로는 함수 객체다. 캡처한 값이 언제 복사되고 언제 참조되는지 모르면 알고리즘 밖에서 dangling이 생긴다.

01

필요한 이름만 캡처한다

[&]와 [=]는 의존성을 숨긴다. limit, logger처럼 필요한 이름을 명시한다.

02

저장 여부 확인

즉시 호출되는 알고리즘 predicate와 나중에 실행되는 callback은 참조 캡처 위험이 다르다.

03

본문 길이를 제한한다

람다 안에 검증, 변환, 로그가 섞이면 이름 있는 함수 객체가 더 낫다.

[x]
값 캡처 현재 값을 람다 객체 안에 복사한다.
큰 객체 복사 비용과 stale value를 본다.
[&x]
참조 캡처 원본 객체 수명이 람다보다 길어야 한다.
비동기 작업에서는 위험하다.
mutable
캡처 복사본 수정 값 캡처한 내부 상태를 바꿀 수 있지만 원본은 그대로다.
의도한 대상인지 확인한다.
generic
타입 일반화 auto 매개변수로 여러 타입에 동작한다.
요구 조건이 흐려질 수 있다.

참조 캡처 · 기본 캡처 · 도메인 로직 점검

참조 캡처 람다가 함수 밖에서 호출될 수 있는데 지역 변수를 참조하지 않는가.
기본 캡처 불필요한 이름까지 캡처해 의존성을 숨기고 있지 않은가.
도메인 로직 본문이 길어져 테스트 가능한 함수로 빼는 편이 낫지 않은가.

저장 callback 한계

auto callback = [id = user.id()](Event event) {
    record_event(id, event);
};