양의 람다: ' []{}' - 예상치 못한 탐구
람다 표현식의 수수께끼 같은 특성을 조사하려는 시도 , "C 11에서는 람다 재정의가 허용되지 않는 이유는 무엇입니까?"라는 질문입니다. 일어났다. Johannes Schaub의 특이한 발견에 따르면 초기 람다 앞에 단항 연산자를 추가하면 컴파일이 가능하다는 사실이 밝혀졌습니다.
쿼리:
다음 코드가 오류 없이 컴파일되는 이유는 무엇입니까? :
int main() { auto test = +[]{}; // Note the unary operator + before the lambda test = []{}; }
이 동작은 C에 따른 것인가요? 표준?
공개:
예, 코드는 C 표준을 따릅니다. 연산자는 람다를 일반 함수 포인터로 변환합니다.
펼치기:
컴파일러는 초기 람다([]{})를 해석하고 생성합니다. 클로저 객체. 이 람다는 어떤 변수도 캡처하지 않기 때문에 클로저 객체를 클로저의 함수 호출 연산자와 동일한 매개변수 및 반환 유형을 갖는 함수 포인터로 변환하는 변환 함수가 존재합니다.
이 변환은 단항의 요구 사항에 부합합니다. 연산자. 모든 유형 T를 T에 대한 포인터로 변환하는 내장 오버로드가 포함되어 있습니다. 클로저 유형은 함수 포인터로의 변환을 제공하여 이 요구 사항을 충족합니다.
결과적으로 표현식 auto test = []{ }; 테스트 유형을 void(*)()로 추론합니다. 이렇게 하면 두 번째 줄에서 후속 할당이 가능해지며 두 번째 람다/클로저 객체도 함수 포인터로 변환되어 호환 가능한 할당이 이루어집니다.
의미:
이 특이한 동작은 람다 표현식의 다양성과 C 언어의 복잡한 메커니즘을 강조합니다. 람다 표현식을 함수 포인터로 변환하여 재할당할 수 있어 유연성과 코드 최적화 가능성이 제공됩니다.
위 내용은 단항 ' ' 연산자를 추가하면 C에서 Lambda 재할당이 허용되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!