단항 플러스 연산자를 사용하여 람다 과부하에 대한 모호성 해결
C에서는 다양한 매개변수 유형으로 여러 구현을 제공하여 함수를 오버로드하면 유연성이 허용됩니다. 코드 재사용. 그러나 람다 표현식으로 함수를 호출하려고 할 때 람다가 여러 오버로드를 충족할 수 있으면 모호성이 발생할 수 있습니다.
모호성 문제
다음 코드 조각을 고려하세요. :
#include <functional> void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([](){}); // ambiguous }
람다 식 []()을 사용하여 foo를 처음 호출하면 컴파일러가 사용할 오버로드를 결정할 수 없기 때문에 모호해집니다. std::function 및 함수 포인터 오버로드는 모두 실행 가능한 후보입니다.
단항 플러스 연산자로 모호성 해결
표기법, 이 경우 단항 플러스 연산자 , 이 모호성을 해결하는 데 사용할 수 있습니다. 람다 식 앞에 단항 더하기를 배치하면 함수 포인터 유형으로 강제 변환됩니다.
foo(+[](){});
이 변환을 통해 함수 포인터 오버로드가 인수 유형 void(*)()와 정확히 일치하도록 만듭니다. , 모호성을 제거합니다.
단항 더하기 연산자
C 표준에 정의된 단항 더하기 연산자는 다음과 같은 속성을 갖습니다.
"The 단항 연산자의 피연산자는 산술, 범위가 지정되지 않은 열거형 또는 포인터 유형을 가져야 하며 결과는 인수의 값입니다."
람다의 경우 산술 또는 포인터 유형이 없어도 가능합니다. 클로저 유형의 속성으로 인해 void (*)()로 변환됩니다. 람다의 클로저 유형에는 람다의 함수 호출 연산자와 동일한 매개변수 및 반환 유형을 사용하여 함수 포인터로의 비명시적 변환 함수가 있습니다.
함수 포인터 오버로드 선택
단항 플러스를 사용하여 void (*)()로 강제 변환하면 두 번째 오버로드인 void foo(void (*f)())가 오버로드 해결 순위에서 정확히 일치하게 됩니다. 이것이 유일하게 정확하게 일치하므로 명확하게 선택됩니다.
대체 접근 방식
또는 모호함을 피하기 위해 람다를 함수 포인터 유형으로 명시적으로 캐스팅하려면 다음 중 하나를 수행하세요. 다음을 사용할 수 있습니다:
foo(static_cast<void (*)()>([](){}));
위 내용은 C에서 람다를 오버로드할 때 단항 플러스 연산자가 모호성을 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!