>백엔드 개발 >C++ >단항 ' ' 연산자를 추가하면 C에서 Lambda 재할당이 허용되는 이유는 무엇입니까?

단항 ' ' 연산자를 추가하면 C에서 Lambda 재할당이 허용되는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-20 06:38:10168검색

Why Does Adding a Unary

양의 람다: ' []{}' - 예상치 못한 탐구

람다 표현식의 수수께끼 같은 특성을 조사하려는 시도 , "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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.