1 minute read

람다식의 개념



  • 인라인 함수 또는 무명의 함수 라고도 부르며, 기본적으로 아래와 같은 문법으로 사용됩니다.

    [캡쳐 블록](파라미터){실행할 처리 또는 함수}(호출인자->생략가능)
    

    [예시]
    매개변수 없는 람다 표현식

    [] { 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;
	};
}


Top