Skip to main content Link Search Menu Expand Document (external link)

람다 표현식 형태

  • 캡처블록과 전달인자, 반환타입은 생략할 수 있다.

[=] 캡처

What does [=] mean in C++?

  • 로컬 변수의 copy된 값을 가져온다
  • [=]를 []로 바꾸면 에러가 발생할 것

예제

C++ 람다 식

struct S { void f(int i); };

void S::f(int i) {
    [&, i]{};      // OK
    [&, &i]{};     // ERROR: i preceded by & when & is the default
    [=, this]{};   // ERROR: this when = is the default
    [=, *this]{ }; // OK: captures this by value. See below.
    [i, i]{};      // ERROR: i repeated
}

함수의 인라인화가 가능

C++ Lambda 사용 이유와 사용 방법

  • 람다는 이름은 없지만 객체
  • 컴파일 과정에서 객체 생성
#include<iostream>
#include<functional>

int main(void) {

    auto f1 = [](int a, int b) {                    //인라인화 OK!!
        return a + b;
    };

    int(*f2)(int, int) = [](int a, int b) {            //인라인화 Fail!!
        return a + b;
    };

    std::function<int(int, int)> f3 = [](int a, int b) {    //인라인화 Fail!!
        return a + b;
    };

    return 0;
}
  • auto 선언은 어떤 type인지 컴파일러만 알 수 있다.
    • auto 선언은 상수화되어 컴파일라가 인라인화를 진행한다.
  • f2는 함수 포인터로 선언
    • 람다는 객체이므로 객체의 주소 값을 함수 포인터 변수로 전달 가능
    • f2는 포인터 변수이기 때문에 다른 값을 재 참조가 가능
    • 즉 실행 중 f2 값이 변경될 수 있음
  • std::function은 auto와 동일하지 않다.
    • std::function은 함수, 함수 객체, 람다 등을 담을 수 있다.
    • 람다 함수를 담을 순 있지만 람다가 std::function에 의해 정의되는 것은 아님
    • f3은 변경이 가능하기 때문에 inline화 불가능