Syntax
[ captures ] ( params ) specs requires(optional) { body } | (1) | ||
[ captures ] { body } | (2) | (until C++23) | |
[ captures ] specs { body } | (2) | (since C++23) | |
[ captures ] < tparams > requires(optional) ( params ) specs requires(optional) { body } | (3) | (since C++20) | |
[ captures ] < tparams > requires(optional) { body } | (4) | (since C++20) (until C++23) |
|
[ captures ] < tparams > requires(optional) specs { body } | (4) | (since C++2 |
캡쳐 블록 : 사용 시 외부 변수를 캡쳐해 람다 body 에서 사용
-> 현재 람다 함수 호출 시 캡쳐가 안된다고 에러가 나고 있는 상황 흑흑
처음에 사용한 캡처 : this 해당 클래스의 변수 참조 가능
& 변수명 : 외부 변수 참조 및 초기화
함수 포인터
함수 포인터 이론은 항상 쏘쏘한데 실무에서 보면 매일 당황스럽다. 왜 함수 포인터를 쓰는지 궁금해서 찾아보다 아래 블로그의 글을 발견했다.
https://hwan-shell.tistory.com/87
함수 포인터를 사용하는 가장 큰 이유는 callback이라고 한다. callback은 함수가 함수를 부르는 형식이다.
실무를 하면서 느낀점은 다들 실무에서는 getter, setter, callback만 알면 된다고 하던데 그래서인지 포인터가 정말 많이 쓰이는 것 같다. 포인터를 사용하지 않으면, 복사가 일어나고 코드도 길어지고 나라가 망하고..
함수 객체
함수 객체는 함수 포인터의 단점을 보완한 것이다.
함수 포인터는 에는 명확한 타입이 없기 때문에 return type과 매개변수가 일치하는 것들만 사용할 수 있어서 제한적이다. 하지만 함수 객체는 어떤 함수 객체가 사용될지 알 수 있어서 inline화 할 수 있다.
다시 람다로 돌아와서, 람다는 함수 객체와 함수 포인터의 장점만 가지고 있다
람다식 장점
1. class 선언 필요 x (코드 길이 줄음)
2. 함수 inline 가능
람다는 이름은 없지만 고유한 객체이기 때문에, 람다의 이름과 어떤 타입으로 정의되어있는지 몰라도 컴파일 과정에서 람다라는 개체를 생성한다. 하지만 포인터를 사용해 간접 전달이 되거나 명확한 명시가 없으면 일반 함수와 다름이 없다.
Reference
https://en.cppreference.com/w/cpp/language/lambda
https://hwan-shell.tistory.com/84
https://www.youtube.com/watch?v=mWgmBBz0y8c&ab_channel=TheCherno
'STUDY' 카테고리의 다른 글
[C++] cbegin, crbegin, cend, crend (0) | 2022.12.05 |
---|