📅 2026-04-04
주말에도 조금씩은 공부해보려고 한다.
auto func = []() { ... }
lambda의 대괄호는 캡처 절이다.
lambda 외부에 있는 지역변수를 안에서 어떻게 가져다 사용할지 정하는 부분이다.
일반 함수는 상위 스코프의 지역변수를 직접 못 쓴다.
lambda는 []를 통해 외부 변수 접근 권한을 얻을 수 있다.
auto func = []() {
std::cout << "LAMBDA"; // 에러X
};
int x = 10;
auto func = []() {
std::cout << x; // 에러
};
아무 변수도 캡쳐하지 않겠다는 뜻이다.
그래서 지역변수를 사용하면 에러가 발생한다.
int x = 10;
auto func = [x]() {
std::cout << x;
}
// result : 10
이렇게 대괄호 안에 x를 넣어주면 값을 복사해서 사용할 수 있게 된다.
복사라고 했으니 lambda가 x의 사본을 하나 가지게 되는 것이다.
다음 예제는 충분히 예상 가능하다.
int x = 10;
// 복사
auto func = [x]() {
std::cout << x;
}
x = 20;
func(); // result : 10
---
int x = 10;
// 참조
auto func = [&x]() {
std::cout << x;
}
x = 20;
func(); // result : 20
[=]
안에서 사용하는 외부 지역 변수를 전부 값으로 캡쳐
[&]
안에서 사용하는 외부 지역 변수를 전부 참조로 캡쳐
캡처는 그 멤버를 어떻게 저장할지 정하는 부분이라고 보면 된다.
int32 damage = 10;
SomeDelegate.BindLambda([Damage]() {
UE_LOG(LogTemp, Warning, TEXT("Damage: &d"), Damage)
});
[Damage]가 없으면 지역변수 Damage를 사용할 수 없다.
당신이 나처럼 아주 얕은 지식을 가지고 있다면 이런 의문이 들 것이다.
언뜻보면 사용처가 비슷해 보이는게 사실이다.
하지만 전혀 다른 상황을 해결하는 도구인데
매번 다른 값을 넣어야 할 때 사용한다.
auto func = [](int x) {
return x * 2;
}
func(5); // result : 10
고정되어있는 값이 있을 때 사용한다.
int input;
int multiplier = 2;
std::cin >> input; // input : 5
auto func = [multiplier](int value) {
return value * multiplier;
}
func(input); // result : 10