참조 : 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; } 출력: 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 |