해당 포스팅을 살펴보다 람다식 에서 햇갈릴만한 내용이 있기에 짧게 정리한다.
우선 람다식은 다음과 같이 작성된다.
[캡처절] (매개변수) mutable -> 반환형식 { 함수내용 }
1. 캡쳐절은 외부 변수를 가져다 쓸 수 있는 공간이고,
2. 매개변수는 말 그대로 함수 선언시 필요한 매개 변수이다.
3. mutable 은 함수 내에서 외부 변수를 수정할 수 있게 해 주는 옵션이고.
4. 반환형식과 함수 내용은 아시리라 믿는다.
use mutable
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 20;
int result = -1;
auto add = [a, b, result]() mutable -> int {
result += a + b;
return result;
};
cout << add() << endl;
cout << result << endl;
}
|
cs |
output : 29, -1
use reference
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 20;
int result = -1;
auto add = [a, b, &result]() -> int {
result += a + b;
return result;
};
cout << add() << endl;
cout << result << endl;
}
|
cs |
output : 29, 29
참조와 mutable의 차이점을 볼 수 있다.
& 참조로 캡쳐절에 선언시, 당연히 해당 변수의 값은 람다식 밖에서도 그대로 유지되지만, (output : 29)
mutable 로 사용시, return 된 value 는 29 값을 띄지만, 밖의 변수는 그대로 -1 을 가지게 된다.
때문에 캡쳐절 & 과 mutable은
람다식을 거치며 외부 변수의 값도 변경하고 싶다 → &
람다식 내에서 Value만 받고, 밖 변수는 그대로 두고 싶다 → mutable
로 사용하면 된다.
+ mutable 은 본래 다음과 같이 사용된다.
1
2
3
4
5
6
7
8
9
10
|
class A {
mutable int a = 10;
int b = 20;
void AAA() const {
a += 20;
}
};
|
cs |
본래 const 와 같이 내부에서 변수 수정과정을 하지 못하게 막는 행위를 mutable 로 뚫고 해제할 수 있는데.
이를 보고 눈치가 빠른 분들은 아시겠지만.
람다식의 경우,
[] 캡쳐절 내에 위치한 참조 변수들은 모두 const 로 참조하게 된다.
때문에 mutable 을 사용하지 않는다면 참조한 변수의 값을 내부에서 수정하는데에 오류가 발생하는 것이다.
물론, & 주소참조로 mutable 을 배제하고 더 직관적으로 작성하는것도 문제는 없다.
주의할 점
람다는 어디까지나 '선언' 이다.
사용하기 전까진 발동된게 아니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <iostream>
using namespace std;
int main()
{
int x = 1;
auto valueLambda = [&x]() mutable -> int
{
x = x + 101;
return x;
};
cout << x << endl;
cout << valueLambda() << endl;
cout << x << endl;
}
|
cs |
output : 1, 102, 102
간혹
임시로 사용되는 함수라는 인식때문에
이를 착각할 수 있으므로 유의 바란다.
'Programming > C++' 카테고리의 다른 글
[C++] OpenCV digit_svm 예제 간단 분석 (0) | 2021.03.31 |
---|---|
[C++] TCP 통신 (0) | 2020.12.20 |
[C++] push_back vs emplace_back 차이점 (2) | 2020.12.07 |
[C++] C4819 Warning 해결 방법, 한글 깨짐 문제 (0) | 2020.12.03 |
[C++] constexpr 사용하기. (0) | 2020.11.22 |