> 백엔드 개발 > C++ > 단항 플러스 연산자는 람다 표현식을 사용한 함수 오버로딩의 모호성을 어떻게 해결합니까?

단항 플러스 연산자는 람다 표현식을 사용한 함수 오버로딩의 모호성을 어떻게 해결합니까?

Barbara Streisand
풀어 주다: 2024-11-16 01:38:02
원래의
284명이 탐색했습니다.

How does the Unary Plus Operator Resolve Ambiguity in Function Overloading with Lambda Expressions?

단항 플러스를 사용한 함수 오버로딩의 모호성 해결

주어진 코드 조각에서:

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 f)는 정확히 일치하지 않습니다.

결과적으로 두 번째 오버로드가 명확하게 선택되어 첫 번째 호출의 모호성을 해결합니다. .

고려사항

단항 트릭을 사용하는 동안 과부하 모호성을 해결하기 위한 방법은 C 표준에 명시적으로 지정되어 있지 않으며 일반적으로 신뢰할 수 있는 동작으로 간주됩니다.

그러나 잠재적인 혼란이나 미래를 피하기 위해 함수 포인터 유형에 대한 명시적 캐스트를 사용하는 것이 좋습니다. 표준 해석의 변경.

위 내용은 단항 플러스 연산자는 람다 표현식을 사용한 함수 오버로딩의 모호성을 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿