TIL: Lambda 구문분석

박춘팔·5일 전

CPP TIL

목록 보기
3/7

📅 2026-04-04
주말에도 조금씩은 공부해보려고 한다.

Lambda

auto func = []() { ... }

C++

auto

auto에 대한 설명은 여기로

대괄호

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

[=] , [&]

[=]

안에서 사용하는 외부 지역 변수를 전부 값으로 캡쳐

[&]

안에서 사용하는 외부 지역 변수를 전부 참조로 캡쳐

캡처는 그 멤버를 어떻게 저장할지 정하는 부분이라고 보면 된다.

Unreal

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
profile
이것 저것 다해보는 삶

0개의 댓글