2011-05-03 2 views
4

템플릿 액션이 있다고 가정 해 봅시다.내 C++ 람다 함수를 캡처 할 수없는 이유는 무엇입니까?

class XCallbackInvoker : public CallbackInvoker<X> 
{ 
public: 
    XCallbackInvoker (Action<int> callback) 
     : CallbackInvoker<X>(
      Action< ::boost::shared_ptr<X> >(
       [&callback](::boost::shared_ptr<X> x) -> void 
       { 
        Action<int> callbackCopy = callback; 
        callbackCopy(x->errorCode()); 
       })) 
    { 
    } 
}; 

이제 임시 복사를 사용하지 않으면 값을 콜백에 의해 참조 된, 잘 컴파일하지만 런타임 오류가 발생합니다 (내 콜백 손실됩니다). 내 lambda에 값 ([=callback])으로 콜백 인수를 전달하고 임시를 사용하지 않으면 컴파일 오류가 발생합니다 (내 표현식에서 일부 const-volatile 한정자가 손실됩니다 ...).

임시를 사용하는 대신 값으로 람다 함수를 캡처합니까?

+1

당신은 또한'CallbackInvoker는 <>'우리가이 자신을 컴파일 시도 할 수 있습니다에 대한 코드를 게시하시기 바랍니다 수 있습니까? – ildjarn

+0

@ildjarn, 감사합니다. –

+0

컴파일러 오류가있는 경우 "내 표현식이 일부 const-volatile 한정자를 잃어 버릴 것"으로 응축하지 말고 질문에 복사하는 것이 좋습니다. 오류 메시지는 아마도이 문제를 일으키는 특정 용도를 암시하고있었습니다. –

답변

11

복사하여 캡처하는 경우 람다의 operator()const으로 선언되어 있으므로 기본적으로 수정할 수 없습니다. 당신은 캡처 된 변수의 변경을 허용하도록 람다에 mutable을 추가해야

XCallbackInvoker (Action<int> callback) 
    : CallbackInvoker<X>(
     Action< ::boost::shared_ptr<X> >(
      [callback](::boost::shared_ptr<X> x) mutable -> void 
      { 
       callback(x->errorCode()); 
      })) 
{ 
} 
+0

꽤 근사한 정보입니다. thx – sehe

+0

고마워, 안소니, 나는 람다에 대한 변이 트릭에 대해 몰랐다. –

+4

또는'struct action'의'operator()'를'const'로 선언하십시오. –

관련 문제