capture clause

캡처 절은 람다가 외부 변수를 빌릴지 복사할지 정한다

[x]는 람다 생성 시점의 값을 저장하고, [&x]는 원본을 계속 바라봅니다. mutable과 수명 문제는 이 차이에서 출발합니다.

[x]
x를 20으로 바꿔도 func(5)는 15
[&x]
본문의 x++가 원본 x를 11로 변경
[*this]
C++17에서 객체 복사본으로 수명 분리

[]

pure

외부 변수를 쓰지 않습니다. 매개변수만으로 결과가 정해지는 짧은 함수처럼 동작합니다.

외부 상태 의존

[var], [=]

copy

생성 시점의 값을 람다 객체 안에 복사합니다. 기본적으로 본문에서 그 복사본을 바꿀 수 없습니다.

원본 변경 영향

[&var], [&]

ref

원본 변수를 참조합니다. 본문에서 값을 바꾸면 외부 스코프의 원본도 같이 바뀝니다.

수명 확인 필요
x = 10

외부 스코프에 값이 있다

[x]

복사본을 저장해 원본과 분리

mutable

복사본만 내부에서 수정 가능

[&x]

원본을 직접 보고 변경

return lambda

참조 대상이 먼저 사라지면 위험

혼합 캡처: [x, &y]처럼 x는 값으로 고정하고 y는 원본을 바꾸게 만들 수 있습니다. 편하지만 어떤 변수가 소유되고 어떤 변수가 빌려 쓰이는지 코드에서 바로 보이게 작성해야 합니다.