>백엔드 개발 >C++ >C에서 자동 유형 추론으로 재귀 Lambda 함수가 실패하는 이유는 무엇입니까?

C에서 자동 유형 추론으로 재귀 Lambda 함수가 실패하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-16 17:57:11249검색

Why Do Recursive Lambda Functions Fail with Auto Type Inference in C  ?

재귀적 람다 함수 및 유형 추론

다음 재귀적 람다 함수를 고려하세요.

auto sum = [term,next,&sum](int a, int b)mutable ->int {
  if(a>b)
    return 0;
  else
    return term(a) + sum(next(a),b);
};

이 코드는 실패합니다. 다음으로 컴파일 오류:

error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function

이 문제는 auto를 사용하여 람다 함수 유형을 추론하는 데서 발생합니다. auto를 사용하면 컴파일러는 초기화 식에서 형식을 유추하려고 시도합니다. 그러나 이 경우 초기화 표현식 자체는 캡처하는 유형을 인식하여 순환 종속성을 생성해야 합니다.

이 문제를 해결하려면 대신 완전히 지정된 함수 객체의 유형을 사용할 수 있습니다.

std::function<int(int,int)> sum = [term,next,&amp;sum](int a, int b)->int {
   if(a>b)
     return 0;
   else
     return term(a) + sum(next(a),b);
};

이 경우 컴파일러는 람다 클로저의 유형을 추론할 필요가 없으며 람다는 해당 유형에 대해 완전히 알 수 있습니다.

재귀적 람다 함수는 유형 추론과 함께 작동할 수 있지만 일반적으로 컴파일 문제가 발생할 수 있으므로 권장되지 않습니다. 대신 유형을 명시적으로 지정하면 컴파일 시 컴파일러가 필요한 모든 정보를 갖게 됩니다.

위 내용은 C에서 자동 유형 추론으로 재귀 Lambda 함수가 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.