2013-07-18 4 views
4

머리말 - 저는 C++ lambda를 좋아합니다. 가능한 한 모든 곳에서 사용할 것입니다.__stdcall을 사용하여 C++ 람다를 정규화하는 방법은 무엇입니까?

이제 람다 요구 사항이 생겼습니다. __stdcall 람다가 필요합니다. 하지만 다음과 같은 오류 메시지가 나타납니다.

error C2664: 'EnumWindows' : cannot convert parameter 1 from '`anonymous-namespace'::<lambda1>' to 'WNDENUMPROC' 
1>   No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

아무도 도와 줄 수 있습니까? 난 그냥 당신이 visual studio 2010 태그가 발견

 auto EnumWindowsProc = 
      [&](HWND hwnd, LPARAM lParam) mutable -> bool 
     { 
      return true; 
     }; 
     EnumWindows(EnumWindowsProc, NULL); 
+0

기본 캡처 인'&'을 제거해보십시오. –

+0

귀하의 의견에 감사드립니다. 나는 노력했지만 작동하지 않습니다. 나는 같은 오류 메시지가있어. – Triumphant

+0

나는 서문에 동의하지 않는다 : lambas는 필요할 때만, 다른 모든 것처럼 사용해야한다. – Jepessen

답변

9

: 여기 내 코드 (EnumWindowsProc 함수의 범위에)입니다. Stateless lambdas는 VC11에서 구현되었습니다. Reference는 : 람다는 작업 용지 (V0.9)에 선정되었고, 변경할 수 람다가 (1.0 버전)를 첨가 하였다

후, 표준화위원회는 람다 1.1 버전을 생산, 에게 표현을 철저하게. 은 VC10에서 구현하기에는 너무 늦었지만 이미 VC11에서 구현했습니다. lambdas v1.1 문구는 정적 멤버 또는 중첩 된 람다를 나타내는 과 같은 구석의 경우에 어떤 일이 발생하는지 명확하게 설명합니다. 이것은 복잡한 lambdas에 의해 트리거 된 버그를 수정합니다. 또한, 무 상태 람다는 이제 VC11에서 함수 포인터로 변환 가능합니다. 이것은 N2927의 표현에서 이 아니지만 어쨌든 lambdas v1.1의 일부로 간주합니다. FDIS 5.1.2 [expr.prim.lambda]/6 : "람다 캡처가없는 람다 식의 클로저 유형은 public이 아닌 가상 함수를 포인터로 갖는 비 명시 적 const 변환 함수를가집니다. 클로저 유형의 함수와 동일한 매개 변수 및 반환 유형 호출 연산자이 변환 함수에서 반환하는 값은 이어야하며 호출 될 때 클로저 유형의 함수 호출 연산자를 호출하는 것과 동일한 효과를가집니다 (예 : ). . " (등 __stdcall 기능을 포인터를 예상 및 API를 처리 할 때 우리가 임의의 호출 규칙과 함수 포인터로 변환 상태 비 저장 람다를했습니다 이후는 것보다 훨씬 좋습니다. 중요 입니다.)

또한이 변환은 두 번째 굵은 인용 부호에서 언급 한 캡처 사양이 없을 때 발생합니다.

+0

__stdcall 한정자를 갖기 위해 함수 범위에서 람다 함수를 사용할 수 있습니까? – Triumphant

+1

흥미 롭다. 필요할 때 '__stdcall'이 될 수 있다는 것을 결코 알지 못했다. – chris

+1

@Triumphant : static_cast (EnumWindowsProc)'를 캐스팅 해보십시오. 지금 테스트 할 컴파일러가 없습니다. ** 편집 ** 신경 쓰지 마라. 이것은 함수 포인터로의 변환이 구현되지 않았기 때문에 VC10에서 작동하지 않을 것입니다. –

관련 문제