C++ 에서 함수를 인자로 전달하는 방법
| C++ 에서 함수를 인자로 전달하기 C++11 이전에는 다른 함수의 인자로 함수를 전달하는 방법은 함수 포인터가 유일했습니다. C언어에서 이어져온 방식이기 때문에 C개발자들에게는 크게 불편하
mynameisdabin.tistory.com
해당 포스팅을 살펴보다 람다식 에서 햇갈릴만한 내용이 있기에 짧게 정리한다.
우선 람다식은 다음과 같이 작성된다.
[캡처절] (매개변수) 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 |