마법의 " " 연산자 디코딩: " []{}" 람다 이해
어리석은 관찰에서 외로운 " " 접두사 C의 람다 식에 기적적으로 재할당이 가능해졌습니다. 이 수수께끼 같은 마법은 왜 다음 코드가 성공적으로 컴파일되는가라는 질문을 촉발시켰습니다.
int main() { auto test = +[]{}; // The "+" operator casts a lambda to a function pointer test = []{}; }
답은 C 표준의 모호한 깊이에 있습니다. " "는 람다에 대한 기존의 일반 함수 포인터로의 변환을 트리거합니다. 캡처하지 않는 람다는 본질적으로 동일한 시그니처를 가진 함수 포인터로의 변환 함수를 보유합니다. C 표준에 정의된 이 변환 함수는 람다의 함수 호출 연산자와 동일하게 동작하는 함수의 주소를 반환합니다.
단항 " " 연산자는 람다가 생성한 클로저 객체에 적용될 때, 내장된 오버로드 세트를 사용합니다. 이러한 오버로드 중 하나는 모든 포인터 유형을 허용하고 이를 함수 포인터로 변환합니다. 따라서 클로저 유형이 오버로드된 유일한 함수 후보인 함수 포인터로 변환되는 것이 우선합니다.
따라서 "auto test = []{};"에서 "test" 유형은 "auto test = []{};"입니다. "void(*)()"로 추론됩니다. 이 함수 포인터 호환성을 통해 두 번째 람다/클로저 개체의 클로저 유형이 다르더라도 "테스트"에 할당할 수 있습니다.
이 지식을 통해 " []{}" 람다 성공의 비결이 밝혀졌습니다. 람다를 함수 포인터로 캐스팅하면 람다 재정의에 대한 제한을 우회하여 새 람다 객체를 할당할 수 있는 기능이 잠금 해제됩니다.
위 내용은 ` []{}`가 C에서 Lambda 재할당을 활성화하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!