단항 플러스를 사용한 함수 오버로딩의 모호성 해결
주어진 코드 조각에서:
void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // not ambiguous (calls the function pointer overload) }
첫 번째 호출 람다 표현식을 인수로 foo하는 것은 모호성으로 인해 컴파일에 실패합니다. 그러나 람다가 함수 포인터 오버로드를 해결하기 전에 단항을 사용한 두 번째 호출은
단항 플러스의 역할
[]에 사용된 연산자는 단항입니다. 플러스 연산자. C 표준에서는 산술형, 범위가 지정되지 않은 열거형 또는 포인터 유형의 피연산자를 피연산자의 값으로 변환하는 것으로 정의되어 있습니다.
이 경우 람다 식이 산술형이 아니더라도 변환할 수 있습니다. 함수 포인터 유형으로.
함수 포인터로 변환 유형
C 표준에 따르면 람다 캡처가 없는 람다 식에는 람다의 함수 호출 연산자와 동일한 매개변수 및 반환 유형을 사용하여 함수를 가리키는 공개 변환 함수가 있습니다.
따라서 단항은 람다 표현식을 함수 포인터 유형인 void로 강제 변환합니다. (*)().
오버로드 해결
두 번째 오버로드인 void foo(void (*f)())는 오버로드 해결에서 정확히 일치합니다. 인수 유형인 void (*)()는 매개변수 유형과 일치합니다. 첫 번째 오버로드인 void foo(std::function
결과적으로 두 번째 오버로드가 명확하게 선택되어 첫 번째 호출의 모호성을 해결합니다. .
고려사항
단항 트릭을 사용하는 동안 과부하 모호성을 해결하기 위한 방법은 C 표준에 명시적으로 지정되어 있지 않으며 일반적으로 신뢰할 수 있는 동작으로 간주됩니다.
그러나 잠재적인 혼란이나 미래를 피하기 위해 함수 포인터 유형에 대한 명시적 캐스트를 사용하는 것이 좋습니다. 표준 해석의 변경.
위 내용은 단항 플러스 연산자는 람다 표현식을 사용한 함수 오버로딩의 모호성을 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!