C++ lambda

람다 캡처 수명·호출 비용

람다는 가까운 곳에 작은 함수를 두는 문법이지만, 캡처가 들어가면 상태를 가진 객체가 된다. 값 캡처와 참조 캡처, mutable, 반환 타입, 알고리즘 predicate 계약을 함께 본다.

01

캡처 결정

필요한 변수만 값 또는 참조로 명시해 수명과 비용을 드러낸다.

[&] 남용 금지
02

호출 계약

알고리즘에 넘길 predicate는 부작용과 순서 관계가 안정적인지 확인한다.

반복 호출
03

수명 전달

람다가 저장되거나 비동기 실행되면 참조 캡처가 살아 있는지 다시 본다.

dangling 위험
04

반환 타입

분기별 반환 타입이 다르면 trailing return type으로 의도를 명시한다.

추론 실패 방지
[=]
값 캡처 기본 사용된 외부 변수를 복사하지만 this 캡처 의미는 표준 버전에 따라 주의가 필요하다.
비용 확인
[&]
참조 캡처 기본 지역 변수를 오래 저장하는 람다에 넣으면 dangling이 생긴다.
저장 금지
mutable
값 캡처 사본 수정 원본을 바꾸는 것이 아니라 closure 내부 사본을 바꾼다.
오해 리스크
generic
auto 매개변수 템플릿 operator()를 가진 람다처럼 여러 타입에 대응한다.
C++14 이후

캡처 목록 · 비동기 · 정렬 점검

캡처 목록 기본 캡처보다 필요한 변수만 명시하는 편이 리뷰에 강하다.
비동기 thread, async, callback에 전달되는 람다는 참조 캡처를 특히 경계한다.
정렬 sort comparator가 외부 상태 변화로 결과를 흔들지 않는지 확인한다.