2017-11-21 3 views
3

두 개의 람다 함수 a1()과 a2()가 포함 된 A() 메서드로 아래에 고안된 클래스를 고려하십시오. a1 내부에서 a2를 호출 할 수 있기를 원합니다. 내가 그렇게 (A1 내부의 두 번째 줄)을 할 때, 나는 오류를다른 람다 함수에서 람다 함수를 호출하는 방법

오류를 얻을 : 변수

그렇게하지 "에는 기본 캡처 모드가 지정되지 않았기 때문에 암시 적으로 캡처 할 수 없다" 이 오류 메시지를 이해하십시오. 내가 여기서 뭘 붙잡아 야지? 나는 람다 정의에 [this]을 사용하면 클래스 foo의 메소드에 접근 할 수 있다는 것을 이해하지만, 내가 원하는 것을 어떻게하는지에 대해서는 분명하지 않다.

미리 감사드립니다.

class foo 
{ 
    void A() 
    { 
     auto a2 = [this]() -> int 
     { 
     return 1; 
     }; 

     auto a1 = [this]() -> int 
     { 
      int result; 
      result = a2(); 
      return result; 
     }; 

     int i = a1(); 
     int j = a2(); 
    } 
}; 

답변

4

당신은 a1의 몸에서 ODR 사용 a2하기 위해 a2를 캡처해야합니다. 단순히 this을 캡처하면 a2을 캡처 할 수 없습니다. this 캡처를 사용하면 둘러싸는 클래스의 비 정적 멤버 만 사용할 수 있습니다. a2이 기본적으로 캡처 될 것으로 예상되는 경우 = 또는 &을 캡처 기본값으로 지정해야합니다.

[this, &a2] // capture a2 by reference 
[this, &] // capture all odr-used automatic local variables by reference, including a2 
+0

빠른 응답을 보내 주셔서 감사합니다. 그러나 저는 아직 명확하지 않습니다. [this, & a2]는 작동하지만 [this, &]는 작동하지 않습니다. – David

+3

@David 어떤 의미에서'[this, &]'가 작동하지 않습니까? – Brian

+0

@David - 컴파일러와 버전을 지정하는 것이 유용 할 수 있습니다. 예를 들어, VS 2017에서는 오류 메시지가 아주 분명하지만'[&, this] '이어야합니다. – zzxyz

관련 문제