C 11의 람다 표현식 유형 추론
C 11에서 람다 표현식은 익명 함수를 생성하기 위한 다용도 도구입니다. 그러나 기본 유형 추론 메커니즘이 항상 직관적이지는 않을 수 있습니다.
코드 조각을 고려하세요.
#define LAMBDA [] (int i) -> long { return 0; } int main() { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! }
코드는 함수 포인터와 자동 변수 모두에 람다 식을 할당합니다. 그러나 해당 유형을 비교하는 어설션은 실패합니다. 이는 다음과 같은 질문을 제기합니다. 자동을 사용하여 추론할 때 람다 표현식의 실제 유형은 무엇입니까?
예상했던 것과 달리 람다 표현식에는 본질적으로 함수 포인터 유형이 없습니다. 대신, functor 객체로 변환됩니다. [] 괄호 안의 모든 항목은 생성자 인수와 펑터 멤버가 되고, () 안의 매개변수는 펑터의 연산자() 매개변수가 됩니다.
변수(빈 [] 괄호)를 캡처하지 않는 Lambda 표현식은 함수로 변환될 수 있습니다. 포인터. 그러나 람다 자체의 기본 유형은 functor 유형으로 유지되며 이는 반드시 함수 포인터와 동일할 필요는 없습니다.
따라서 pFptr 유형이 함수 포인터이기 때문에 코드 조각의 어설션은 실패합니다. pAuto 유형은 람다 표현식으로 생성된 펑터 유형입니다.
위 내용은 C 11 람다 표현식의 '자동' 추론이 함수 포인터 유형과 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!