[C++] 람다식 이란
람다식의 개념
-
인라인 함수 또는 무명의 함수 라고도 부르며, 기본적으로 아래와 같은 문법으로 사용됩니다.
[캡쳐 블록](파라미터){실행할 처리 또는 함수}(호출인자->생략가능)
[예시]
매개변수 없는 람다 표현식[] { cout << " 인자 없음 " << endl; };
매개변수 있는 람다 표현식
[] (int a, int b, int c) { cout << a << b << c << endl; };
매개변수 없고 반환 있는 람다
[] { return 200; };
매개변수 있고 반환 있는 람다
[] (int a, int b) { return a * b; } ;
캡쳐 블록 람다는 호출되는 스코프 범위에서 존재하는 변수들을 캡쳐 할 수 있으며, 대상을 값으로 캡쳐 할 것인지 참조로 캡쳐할 것인지를 캡쳐블록으로 설정할 수 있다.
Scope내의 모든 변수 캡쳐
[=]
- 스코프 내의 모든 변수를 값 복사 합니다.
- 멤버함수에서 람다가 호출 된다면 this 포인터도 전달됩니다.
[&]
- 스코프 내의 모든 변수를 참조로 복사합니다.
—
Scope내의 일반 변수 캡쳐
[&x]
- 변수 x만 참조로 캡쳐합니다. 다른 변수는 캡쳐하지 않습니다.
[x]
- 변수 x만 값을 캡쳐합니다. 다른 변수는 캡쳐하지 않습니다.
[=], [&x]
- 모든 변수는 기본으로 값으로 캡쳐하고 x변수만 참조로 캡쳐합니다.
[&], [x]
- 모든 변수는 기본으로 참조로 캡쳐하고 x변수만 값으로 캡쳐합니다.
[this]
- 클래스 멤버 함수인 경우 자기 자신을 전달합니다. ( [=]로도 전달 됨
- 캡쳐는 람다가 생성되는 scope 안에서 보이는 지역 변수에만 적용됩니다.
장단점
[장점]
- 함수 객체와는 다르게 class를 선언할 필요가 없어 코드가 간결해진다.
- 함수 포인터와 달리 함수의 인라인화가 가능하다.
[단점]
- Break Point로 디버깅할 때 처리를 쫓아가는게 힘들다.(인라인화 되어있으니….)
코드 및 주석
[기본]
void Sum(int number_01, int number_02)
{
std::cout << number_01 + number_02 << std::endl;
}
int main()
{
int m_number_01 = 10, m_number_02 = 20;
// use function
Sum(m_number_01, m_number_02);
// use Lambda
[](int number_01, int number_02) {
std::cout << number_01 + number_02 << std::endl;
}(m_number_01, m_number_02);
}
[캡쳐블록]
int main()
{
int count_01 = 10, count_02 = 20;
auto max_count = [=]() {
return count_01 > count_01 ? count_01 : count_01;
};
}