> 백엔드 개발 > C++ > C 11에서 `auto`가 람다 표현식의 유형을 함수 포인터로 추론하지 못하는 이유는 무엇입니까?

C 11에서 `auto`가 람다 표현식의 유형을 함수 포인터로 추론하지 못하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-08 03:59:09
원래의
303명이 탐색했습니다.

Why Doesn't `auto` Deduce a Lambda Expression's Type as a Function Pointer in C  11?

C 11의 "auto"를 사용하여 람다 유형 추론의 신비를 풀다

C 11 영역에서 람다 표현식의 도입으로 인해 의문이 제기되었습니다. "auto" 키워드를 사용하여 추론할 때 기본 유형에 대해 알아봅니다. 다음 코드 조각에서 볼 수 있듯이 람다의 유형이 함수 포인터라는 가정은 부정확한 것으로 판명되었습니다.

#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!
}
로그인 후 복사

이 코드는 함수 포인터와 "auto"를 사용하는 람다 식 간의 유형 추론 불일치를 보여줍니다. " 키워드. 흥미롭게도 어설션이 실패하고 람다 유형이 함수 포인터가 아님이 드러납니다.

람다 유형의 진정한 특성 공개

이 명백한 역설을 이해하려면, C 11에서는 람다 식의 유형이 지정되지 않은 상태로 남아 있다는 점을 인식하는 것이 중요합니다. 펑터. 이 변환 내에서 대괄호("[]") 안의 요소는 생성자 매개변수 및 클래스 멤버가 되고, 괄호 안의 요소는 펑터의 연산자()에 대한 매개변수가 됩니다.

특히, 변수 캡처가 없는 람다( 빈 대괄호)는 MSVC2010에서 지원하지 않는 기능인 함수 포인터로 변환되는 기능을 가지고 있습니다. 그러나 이러한 변환이 가능하더라도 람다의 고유 유형은 지정되지 않은 별개의 펑터 유형이라는 점을 강조하는 것이 여전히 중요합니다.

결론

"auto " 키워드는 유형 추론의 편의성을 제공하지만 다양한 언어 엔터티의 기본 유형을 식별하는 것이 중요합니다. 람다 식의 경우 불특정 특성과 함수 포인터(해당되는 경우)로의 변환 가능성은 C 11이 제공하는 유연성을 강조하는 동시에 언어의 복잡한 뉘앙스를 이해하는 것의 중요성을 강화합니다.

위 내용은 C 11에서 `auto`가 람다 표현식의 유형을 함수 포인터로 추론하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿