"this"가 람다에 의해 캡처 될 때 명시 적으로 사용해야합니까?


27

내가 찾은 예제 this는 람다에서 캡처 하여 명시 적으로 사용합니다. 예 :

capturecomplete = [this](){this->calstage1done();};

그러나 암시 적으로 사용할 수도 있습니다. 예 :

capturecomplete = [this](){calstage1done();};

나는 이것을 g ++로 테스트하고 컴파일했다.

이 표준 C ++입니까? (있는 경우 어떤 버전) 또는 어떤 형태의 확장입니까?


1
정답은 정확하지만 this->명시 적으로 사용하는 이유 는 명시 적으로 캡처 된 값이 명시 적으로 사용되도록하기위한 것입니다. 캡처되지 [](){ calstage1done(); }않기 때문에 합법적이지 않다는 점에 유의하십시오 this. 캡처 할 때하지만, this명시 적으로 함수 몸을 위해, 그것은 놀라운 표시 실제로 캡처 된 값을 사용하지 않는 한 눈에 : [this](){ calstage1done(); }.
Kyle Strand

나는 이것을 볼 수 있지만, 동시에 간단한 작업이되어야하는 것에 대해 끔찍한 장황한 것처럼 보입니다.
plugwash

1
MSVC (2015 this
년만 가능)

@ plugwash : 개발자는 항상 게으르고 물건을 최소화하려는 경향이 있으며 언어 디자이너도 다르지 않습니다. 그러나, 모호성을 해결하기 위해 자세한 정보가 필요한 경우가 많으며, 여기에 해당됩니다.
Flater

답변:


25

그것은 표준이며 람다가 추가 된 C ++ 11 이후로 계속되었습니다. cppreference.com 에 따르면 :

이름 조회의 목적으로 this포인터 의 유형과 값을 결정하고 비 정적 클래스 멤버에 액세스하기 위해 클로저 유형의 함수 호출 연산자 본문이 람다 표현식의 컨텍스트에서 고려됩니다.

struct X {
    int x, y;
    int operator()(int);
    void f()
    {
        // the context of the following lambda is the member function X::f
        [=]()->int
        {
            return operator()(this->x + y); // X::operator()(this->x + (*this).y)
                                            // this has type X*
        };
    }
};

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.