[C++] 람다식 mutable 의 쓰임세.

2020. 12. 7. 15:51·Programming/C++

 

 

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;
 
}
Colored by Color Scripter
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;
 
}
Colored by Color Scripter
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;
}
Colored by Color Scripter
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
'Programming/C++' 카테고리의 다른 글
  • [C++] OpenCV digit_svm 예제 간단 분석
  • [C++] TCP 통신
  • [C++] push_back vs emplace_back 차이점
  • [C++] C4819 Warning 해결 방법, 한글 깨짐 문제
Cyp
Cyp
  • Cyp
    Cyp Software Blog
    Cyp
  • 전체
    오늘
    어제
    • Cyp Blog (161)
      • Artificial Intelligence (38)
        • Article (19)
        • Post (2)
        • Basic (14)
        • Preferences (3)
      • Cyber Security (1)
      • Programming (46)
        • C++ (21)
        • C# (19)
        • Python (2)
        • Rust (0)
        • Java (1)
      • Algorithm (17)
        • BACKJOON (15)
      • Operating System (14)
        • WSL (2)
        • Windows (1)
        • Linux (5)
        • Security (3)
      • Tools (26)
        • Docker (3)
        • DataBase (2)
        • SSH (1)
        • Doxygen (2)
        • Etc (17)
      • Miscellaneous (19)
        • Book (2)
        • Hardware (2)
        • Hevel (1)
  • 블로그 메뉴

    • Home
    • Guest Book
  • 링크

  • 공지사항

    • 블로그 업데이트 노트
    • 블로그 운영방침
  • 인기 글

  • 태그

    utf-8 bom
    Bom
    C4819
    UTF-8 without BOM
    y-cruncher
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Cyp
[C++] 람다식 mutable 의 쓰임세.
상단으로

티스토리툴바