operator()를 가진 객체에 가깝습니다.find_if, sort, for_each, remove_if에서 특히 자주 등장합니다.[capture] (params) { body }
| 요소 | 설명 |
|---|---|
| capture | 외부 변수를 람다 안으로 가져오는 방식 (복사/참조) |
| params | 매개변수 (일반 함수와 동일) |
| body | 구현부. return 타입은 자동 추론. 명시하려면 -> int 등 사용 |
확장 형태(옵션 포함):
[capture] (params) mutable noexcept -> return_type { body }
mutable: 값 캡처 변수를 람다 내부에서 수정 허용noexcept: 예외 비발생 명시-> return_type: 반환형 명시auto it = std::find_if(inventory.begin(), inventory.end(),
[](const Item& item) { return item.rarity == Rarity::Unique; });
IsUniqueItem 같은 펑터를 별도 선언하지 않아도 조건을 바로 표현할 수 있습니다.auto add = [](int a, int b) -> int { return a + b; };
std::sort(v.begin(), v.end(), [](int a, int b) {
return a > b; // 내림차순
});
| 모드 | 문법 | 설명 |
|---|---|---|
| 값 캡처 | [x], [=] | 캡처 시점 복사본 사용 |
| 참조 캡처 | [&x], [&] | 원본 참조 사용 |
| this 캡처 | [this] | 객체 포인터(this) 캡처 |
| 객체 복사 캡처 | [*this] (C++17) | 객체 자체를 값으로 복사 |
| 초기화 캡처 | [p = std::move(ptr)] | 이름/초기화식을 직접 지정 |
int wantedId = 2;
auto it = std::find_if(items.begin(), items.end(),
[wantedId](const Item& item) { return item.id == wantedId; });
auto up = std::make_unique<Job>();
auto task = [job = std::move(up)]() mutable {
// move 캡처한 unique_ptr 사용
};
실무 권장:
[=], [&])보다 개별 캡처를 우선 사용Knight*를 참조 캡처한 Job을 만들고 Knight가 먼저 파괴되면,[=]를 쓰고 멤버에 접근하면, 실제로는 this 포인터에 의존합니다.int hpSnapshot = hp_; // 멤버 값을 로컬로 복사
auto fn = [hpSnapshot]() {
// this 없이 안전하게 사용
};
shared_ptr/weak_ptr)을 같이 설계합니다.예: weak_ptr 패턴
std::weak_ptr<Knight> wk = knightShared;
auto job = [wk]() {
if (auto sk = wk.lock()) {
sk->ResetHp();
}
};
find_if의 Predicate은 짧고 맥락 의존적이라 람다로 쓰면 가독성이 높습니다.int wantedId = 42;
auto it = std::find_if(items.begin(), items.end(),
[wantedId](const Item& item) { return item.id == wantedId; });