프로그래밍/cpp

C++11 람다 표현식(lamda expression)

콘파냐 2015. 7. 14. 18:19

C++11에 등장한 람다 표현식은 함수를 별도 선언 없이(이름 없이) 인라인으로 사용하게 해준다. 


람다 표현식은 기본적으로 함수의 내부에서 사용할 수 있는데, 

사용 방법은 다음과 같다.

 

람다의 기본 문법 예


 

캡쳐 블록

외부 변수를 사용(캡쳐)한다

사용 예) [], [=], [&], [&x, y], [=,&y] …

[] - 캡쳐블록이며 생략할 수 없다. 외부 변수를 사용하지 않는다는 뜻이다. 기본적으로 []로 시작하면 람다식임을 나타낸다.

[=] - 는 값을 복사하여 사용 [&]는 참조하여 사용, 특정 변수를 쓰지 않으면 전체를 참조 또는 복사한다는 뜻이다.

[&x, y] - x는 참조하여 사용 y는 복사하여 사용한다는 뜻이다.

[=, &y] - 모두 복사하여 사용하는데, y만 참조하여 사용한다는 뜻이다. =는 디폴트 캡쳐 방식인데 [&y,=]는 허용되지 않는다. 디폴트 캡쳐 방식은 목록 첫 번째 와야 한다.

 

인수 목록

기본적으로 생략 가능하고 생략하면 전달 인수는 없다는 뜻이다. 사용하는 경우 인수 전달 값과 매치 된다.

 

mutable

캡쳐 블록에서 캡쳐한 외부변수가 복사될 때는 내부에 변수가 새로 만들어지고 const지정자가 붙어서 복사된다. const로 복사되므로 이 값을 람다함수 내부에서 바꿀 수 없다.

반면에 mutable이 붙으면 외부변수를 복사 할 때 const가 붙지 않는다.  참고 : &로 캡쳐된 변수는 해당 사항이 없다.

 

리턴타입

리턴타입은 생략 가능하고 생략했을 시 {}내부에서 리턴되는 타입이 자동으로 리턴타입이 된다.

 

()인수의 전달

인수목록에 맞게 인수를 전달할 수 있다. ()는 함수를 실행하라는 의미로 생각해도 되는데,

만약 람다함수를 람다표현형 타입 변수에 넣고 싶다면 ()를 생략하면 된다.

 

람다 표현식의 타입

람다 표현식은 일종의 함수라 볼 수 있다. 함수와 같이.<functional>의 std::function을 사용할 수 있다.

아주 간단한 예이다.

 

람다 표현식을 이용한 콜백함수

아마 std::function를 이용한 콜백함수의 형태를 본 적이 있을 것이다. 람다 표현식 또한 std::function을 이용하여 콜백함수로 이용될 수 있다.

간단한 예)

 

기타

람다 표현식이 함수내에서 리턴 값으로 사용되는 경우 캡쳐블록에서 &를 사용하면 문제가 발생한다. 리턴된 후 람다 표현식이 들어있던 함수의 지역변수는 파괴되므로 =를 사용하도록 하자.

반응형