2017-09-26 1 views
4

람다에서 참조를 반환하는 데 약간의 문제가 있습니다. 이 코드는 작동합니다C++ 11 람다 반환 참조

std::function<int*(int*)> funct; 

funct = [](int *i){ 
    ++*i; 
    return i; 
}; 

int j = 0; 
LOG<<*funct(&j)<<j; 

출력 : 1

하지만이 하나

std::function<int&(int&)> funct; 

funct = [](int &i){ 
    ++i; 
    return i; 
}; 

int j = 0; 
LOG<<funct(j)<<j; 

건물의 오류 : C : \ Program 파일 (x 86) \ 마이크로 소프트 비주얼 스튜디오 14.0 \ VC \ include \ type_traits : 1441 : 오류 : C2440 : '반환': 'int'에서 'int &'로 변환 할 수 없음

왜 그런가? 나에게 그것은 똑같은 것이다.

+0

[MCVE]를 제공해주십시오. 현재 컴파일되지 않습니다. – tambre

+0

왜 그것을 참조로 돌려 주시겠습니까? 해결해야 할 문제는 무엇입니까? 왜 단순히 값으로 반환하지 않는가? (이것은 람다가 이미 수행 한 것인가?) –

+0

@Someprogrammerdude 매개 변수로 참조로 가져 오기 때문에. 예를 들어'std :: ostream :: operator <<'연쇄 호출. – Slava

답변

18

람다는 반환 유형을 auto과 같이 추론합니다. auto ret = i;retint으로 추정합니다. 코멘트에 다른 방법을 언급 한 바와 같이

funct = [](int &i) -> int& { 
    ++i; 
    return i; 
}; 

은 본질적으로 어떤 공제를하고하지 컴파일러를 알려줍니다

funct = [](int &i) -> decltype(auto) { 
    ++i; 
    return i; 
}; 

입니다 :

하나의 해결책은 명시 적으로 람다의 리턴 타입을 명시하는 것입니다 반환 식에 decltype이 사용 된 것처럼 형식을 사용하기 만하면됩니다.

정확한 규칙에 대해 궁금한 경우 the documentationauto 섹션과 decltype(auto) 섹션이 있습니다.

+0

또는 반환 유형으로'decltype (auto)'를 사용하십시오! 이것은'auto'의 사용법과 대조적입니다. 즉,'decltype (auto) ret = i;'는'i'에 대한 참조로'ret'를 만듭니다. – Nawaz

+0

사람들은 C++에 애매하고 복잡한 구문이 있다고 말합니다. 그들이 뭘 알고 있는지 :-) – pm100