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 중국어 웹사이트의 기타 관련 기사를 참조하세요!