2014-06-25 5 views
10

양의 정수를 비교하는 함수를 고려하십시오. 함수 자체는 람다를 사용하여 작업을 수행합니다.C++ 11 람다 식 - 인수 대 인수 전달

// Pass n1, n2 by value to the lambda. 
bool Compare(int n1, int n2) { 
    return [](int n1, int n2) { return n1 > n2; }; 
} 

위의 코드 조각은 정상적으로 컴파일됩니다. Compare()는 항상 true를 반환합니다.

그러나, 다음과 같은 코드도 컴파일에 실패 -

// capturing values 
bool Compare(int n1, int n2) { 
    return [n1, n2]() -> bool { return n1 > n2; }; 
} 

을하고 오류를 반환

lambda.cpp:48:46: error: cannot convert 'Compare(int, int)::__lambda2' to 'bool' in return 
    return [n1, n2]() -> bool { return n1 > n2; }; 

질문

이 람다의 도입의 목적으로 사용되지 않습니다 수 있음 C++에서는 여전히 ...

  1. 첫 번째 이유는 항상 참을 반환하는 이유는 무엇입니까?
  2. 두 번째 컴파일이 실패하는 이유는 무엇입니까?

답변

17

왜 첫 번째 것이 항상 true를 반환합니까? (포인터가 null 적이 없기 때문에 람다 위해 항상 true) 논리 값을 암시 적으로 변환됩니다 함수 포인터로

주면서 붕괴.

왜 두 번째 컴파일이 실패합니까? 아무것도 캡처

주면서 함수 포인터에이 변환이없는

당신이 람다를 사용해야하는 경우 (그 상태가 통과 할 어떻게?) :

가 전화 :

return [](int n1, int n2) { return n1 > n2; }(n1, n2); //notice the() to call it 

두 번째 방법은 의미가 있지만 단지 return n1 > n2 :

이 아닙니다.
return [=] { return n1 > n2; }(); //= captures everything used by value 
            //-> bool and parameter list are redundant 

마지막으로, std::greater<functional>에 이미 않는다는 것을 주목할 필요가이 : 완성도를 들어

std::sort(…, std::greater<int>()); //std::greater<> in C++14 
+1

, 올바르게 두 번째를 사용하는 방법을 추가 할 가치가있다. –

+0

@RSahu, 완료, 감사합니다. – chris