Programming/MFC-C++

람다 표현식(Lambda expression)

빠릿베짱이 2015. 5. 13. 22:45
반응형

참조 : http://frompt.egloos.com/2770424


 람다 표현식 (Lambda expression)

 

익명 함수 개념

익명 함수는 본문은 있지만, 이름이 없는 함수


■ 형태

[캡처블록](파라미터목록) mutable 익셉션목록 ->리턴타입 { 함수바디 }


캡처 블록 : 람다 함수 안에서 참조할 바깥 변수를 지정

파라미터 목록(생략 가능) : 생략 시 mutable, 익셉션, 리턴 타입을 지정하지 말아야 한다.

mutable : 람다함수에 복제되는 변수의 const 타입 제거

익셉션 목록 : 바디 안에서 throw할 수 있는 익셉션 종류 지정

리턴 타입 : { return expression; }이 생략되면, void로 취급된다.


▶ 캡처 블록(capture block) :

                  스코프에서 접근 가능한 바깥 변수를 람다 표현식의 바디에서 어떻게 접근할지 지정한다.

[=] 모든 변수를 값으로서복제하여 캡처한다.

[&] 모든 변수를 참조로서 캡처한다.

[] 어떠한 변수도 사용하지 않는다는 의미

[&x] 변수 x만을 참조한다.

[x] 변수 x만을 값으로서 캡처한다.

[=,&x,&y] 모든 변수를 디폴트 값으로 캡처하되, 변수x,y에 대해서는 참조로 캡처한다.

[&, x] 모든 변수를 디폴트 참조로 캡처하되 변수 x는 값으로 캡처한다.

[&x, &x] //error 동일 변수의 반복 지정은 허용되지 않는다.


캡쳐 방식 예제


 [&, i]{};    // OK
 [&, &i]{};   // ERROR: i preceded by & when & is the default
 [=, this]{}; // ERROR: this when = is the default
 [i, i]{};    // ERROR: i repeated


반환 형식 예제


auto x1 = [](int i){ return i; }; // OK: return type is int
auto x2 = []{ return{ 1, 2 }; };  // ERROR: return type is void, deducing 
                                  // return type from braced-init-list is not valid


람다 본문

람다 식의 람다 본문(표준 구문의 compound-statement)에는 일반 메서드 또는 함수 본문에 포함할 수 있는 모든 항목을 포함할 수 있습니다. 일반 함수와 람다 식 모두의 본문은 다음과 같은 종류의 변수에 액세스할 수 있습니다.


● 매개 변수

● 로컬로 선언된 변수

● 클래스 데이터 멤버(클래스 내부에서 선언되고 this가 캡처된 경우)

● 정적 저장 기간이 있는 모든 변수(예: 전역 변수)



// captures_lambda_expression.cpp
// compile with: /W4 /EHsc 
#include <iostream>
using namespace std;

int main()
{
   int m = 0;
   int n = 0;
   [&, n] (int a) mutable { m = ++n + a; }(4);
   cout << m << endl << n << endl;
}
출력: 

5

0

n 변수는 값별로 캡처되므로 람다 식을 호출한 후 해당 값이 0으로 유지됩니다. mutable 사양을 사용하면 람다 내부에서 n을 수정할 수 있습니다.



반응형

'Programming > MFC-C++' 카테고리의 다른 글

Visual Studio 스타일 & Tip  (0) 2015.05.16
Thread Pool C++ 11  (0) 2015.05.14
Cmd 명령 실행, 제어, Pipe, SpawnAndRedirect  (0) 2015.05.13
[Eigen] C++ Matrix Library  (1) 2015.05.12
Matlab fitgeotrans function convert C++  (0) 2015.05.08