auto Lambda = [캡처_블록](파라미터_목록)mutable 익셉션_목록 속성_지정 -> 리턴_타입{함수_바디};
캡처 블록 : 람다 함수 안에서 참조할 바깥 변수들을 지정한다.
지정한 변수들은 람다 함수의 스코프 안으로 들어와서 함수 바디에서 접근할 수 있게 된다.
파라미터 목록 (생략 가능) : 표현식에서 넘겨받을 파라미터 목록을 정의한다.
생략하려면 mutable, 익셉션 목록, 리턴 타입을 지정하지 않아야 한다.
mutable (생략 가능) : 람다 함수의 const 속성을 지워서 캡처받은 변수를 수정할 수 있게 한다.
익셉션 목록 (생략 가능) : 람다 표현식의 바디 본체 안에서 throw 할 수 있는 익셉션 종류를 지정한다.
속성 지정 (생략 가능) : 람다 표현식의 속성을 지정한다.
리턴 타입 (생략 가능) : 람다 표현식의 리턴 타입을 지정한다. 생략하게 되면 일반 함수의 리턴 타입이
추론되는 것과 같이 자동으로 추론된다.
변수를 캡처한다는 의미는 그 변수를 람다 표현식의 본체 안에서 사용할 수 있게 된다는 것이다.
[]와 같이 공백으로 캡처블록을 정의하면 주변 스코프 내의 어떤 변수도
람다 표현식 안에서 사용하지 않는 것을 의미한다
캡처 블록 안에 변수 이름을 지정하면 그 변수를 값으로서 복제하여 사용하게 된다
컴파일러는 람다 표현식을 함수 객체의 한 종류로 변환한다
캡처된 변수는 함수 객체의 멤버 변수로 복제된다
이 멤버 변수는 캡처된 변수의 const 설정을 그대로 상속받는다.
// data가 non-const 타입이므로 함수 객체가 non-const 타입의 data 멤버 변수를 가지게 된다
double data = 1.23;
auto capturingLambda = [data] {cout << "Data = " << data << endl; };
capturingLambda();
캡처된 복제본의 값을 바꾸고 싶다면 mutable 속성을 지정해야 한다.
변수를 캡처할 때 &을 덧붙여서 참조로 캡처할 수도 있다.
C++ 14 부터는 람다 표현식에 대해 자동 타입 추론 기능이 지원된다.
명시적인 타입 지정 없이 auto 를 사용할 수 있다.
vector<int> ints{ 11, 55, 101, 200 };
vector<double> doubles{ 11.1, 55.5, 200.2 };
// 100을 넘는 값을 찾는 제네릭 람다 표현식 정의
auto isGreaterThan100 = [](auto i) {return i > 100; };
auto iter = find_if(cbegin(ints), cend(ints), isGreaterThan100);
if (iter != cend(ints))
cout << "Found a value > 100 : " << *iter << endl;
auto iter2 = find_if(cbegin(doubles), cend(doubles), isGreaterThan100);
if (iter2 != cend(doubles))
cout << "Found a value > 100 : " << *iter2 << endl;
'프로그래밍 > C++' 카테고리의 다른 글
보기 좋은 코드의 중요성과 코드의 디자인 (0) | 2019.03.09 |
---|---|
auto, decltype, 문자열 (0) | 2019.03.08 |
가상 메모리 (Virtual Memory) (0) | 2019.02.23 |
동기화 (Synchronization) (0) | 2019.02.21 |
커널 영역과 유저 영역 (0) | 2019.02.20 |