2013-05-03 4 views
13

람다 복귀되어 다음의 기능을 고려STD없이 람다 복귀 :: 함수

std::function<int()> make_counter() 
{ 
    int i = 0; 
    return [=]() mutable { return i++; }; 
} 

것이 가능하다 std::function으로 배치하지 않고, 실제 람다 형을 반환?

답변

18

C++ 11 : 모든 람다 식 갖는다 호, I는 (§5.1.2/3) 인용 :

[...]은 고유없는 비 연합 클래스 타입 [를 ...]

이것은 실질적으로 해당 표현식을 몰라도 람다 유형을 알 수 없다는 것을 의미합니다.

이제 아무 것도 포착하지 않으면 함수 포인터로 변환하여 함수 포인터 유형을 반환 할 수 있지만 꽤 제한적입니다.

auto const make_counter = [](int i = 0) { 
    return [i]() mutable { return i++; }; 
}; 

: 당신이 당신의 make_counter (그렇지 않은 템플릿 또는 과부하, 또는 어떤 경우), 다음 작업 것이다 교체하고자하는 경우

는 @Luc는 라운지에서 언급 한 바와 같이

C++ 1y : 예, 일반 함수 (N3582)에 대한 반환 유형 공제를 통해

+1

람다 식은 C++ 11에서도 유효하지 않습니다. 본문에 'return expression; (§5.1.2,4) –

+0

이상이 포함되어 있으면 반환 유형 공제가 작동하지 않습니다. 기술적으로는 기본적으로 동일한 것을 다시 구현하는'my_not_STD_function'을 반환 할 수 있습니다. – Yakk

+1

@Arne : Blame 편집을위한 OP : ... P 고정. – Xeo

10

반칙 유형 공제를 속이고 사용하는 경우 yes you can (Link).

이것은 람다 (lambda를 람다가 사용하는 lambda를 사용하는)를 사용하는 일반적인 비 경고 유도 C++ 11에서 수행 할 수 있지만 C++ 11 자체를 넘어서는 경우에만 가능합니다. .

+0

Not C++ 11, 아직 (아직) 표준이 아닙니다. – Xeo

+0

그래, C++은 여전히 ​​느리다. = [ –

+0

@Fred 다시 링크를보고, 컴파일에 사용 된 명령 행에주의하십시오. –