람다는 함수 객체를 빠르게 만드는 문법이다.
람다는 [](매개변수){함수 본체} 의 형식으로 이루어져있다.
반환타입이 없는데 auto와 같이 자동으로 반환타입을 추론한다.
[](매개변수)->반환타입{함수본체}의 형식으로 반환타입을 정할 수도 있다.
auto LambObj = [=](Item& item){return Item.id==itemId}; //클로져
위와 같이 람다로 만든 객체를 클로져라고 한다.
그런데 본체 부분에서 itemId는 어디서 불러오는 것일까?
함수 객체에서는 변수를 만들어 저장하지만 람다에서는 다른 곳에 있는 변수를 가져와 저장할 수 있다.
가져오는 방식에 따라 복사면 []괄호안에 =, 참조면 &을 쓴다. 이것을 캡쳐 모드라고 한다.
그래서 위 예제에서 복사를 사용하면 람다 생성 시점의 itemId 값, 참조를 사용하면 람다 사용 시점의 itemId값을 이용한다.
auto LambObj = [&itemId,rarity,type](Item& item)
{
return Item.id==itemId&& Item.rarity==rarity&& Item.type==type;
};
auto LambObj = [=,&itemId](Item& item)
{
return Item.id==itemId&& Item.rarity==rarity&& Item.type==type;
};
캡쳐 모드는 각 변수마다 설정할 수 있으며 C++에서는 각 변수마다 설정할 것을 권고하고 있다.
변수를 복사하느냐 참조하느냐에 따라 메모리 오류가 발생할 수 있기 때문이다.
따로 &를 붙이지 않으면 복사로 처리되고 두번째 코드처럼 기본을 복사로 하고 특정 변수만 참조로 지정할 수도 있다.
'C++' 카테고리의 다른 글
| [C++] 포인터 비트 단위 이해 (0) | 2022.12.25 |
|---|---|
| [C++] 전역 변수, 정적 변수, 외부 변수 (0) | 2022.12.23 |
| [C++] 오른값 참조(rvalue reference) (0) | 2022.06.25 |
| [C++] 사용하지 않는 함수 삭제하기 (0) | 2022.06.25 |
| [C++] enum vs enum class (0) | 2022.06.25 |