재우이 2022. 2. 25. 17:56

람다 (Lambda)

- 익명함수

- 익명의 함수 객체를 정의

- 성질은 함수 객체와 동일하나 이름이 없는 함수

- 알고리즘이나 비동기 메서드에 전달하는 몇 줄의 코드를 캡슐화하는데 사용

- 타입을 가지고 있지만 decltype 나 sizeof를 사용할 수 없다.

 

람다 사용법

[captures](parameters){body}(call lambda);

[captures] 

캡처 조항(Capture Clause)

- 람다의 body에서 어떤 변수를 어떻게 사용할지 낱

종류 내용
[] 같은 영역에 있는 모든 변수 접근 불가
[&] 같은 영역에 있는 모든 변수를 참조로 캡처
[=] 같은 영역에 있는 모든 변수를 값으로 캡처
[변수 i] 같은 영역에 있는 변수 i 만 값으로 캡처, 나머지 다른 변수들에는 접근 불가
[&변수 i] 같은 영역에 있는 변수 i 만 참조로 캡처, 나머지 다른 변수들에는 접근 불가
[&, 변수i] 같은 영역에 있는 모든 변수를  참조로 캡처, 변수 i 만 값으로 캡처
[=, &변수i] 같은 영역에 있는 모든 변수를 값으로 캡처, 변수 i 만 참조로 캡처

 

[] 경우 같은 영역에 있는 변수 접근 불가

[&] 같은 영역에 있는 모든 변수를 참조로 캡처

[=] 같은 영역에 있는 모든 변수를 값으로 캡처

 

총 코드

#include<iostream>
using namespace std;

int main()
{
	/*[]() {cout << "hello world" << endl; }();
	[](int i) {cout << "int i : " << i << endl; }(7);

	auto sum = [](auto a, auto b) {return a + b; };

	cout << sum(3, 1) << endl;*/

	int a = 4;
	int b = 8;
	int c = 6;

	//같은 영역에 있는 모든 변수 접근 불가
	//[]() {cout << a << endl; }();
	/*[&]() {cout << a << endl; }();
	[&]() { a = 5; cout << a << endl; }();*/
	//[=]() {cout << b << endl; }();

	[c]() {cout << c << endl; }()
}