Lambda 함수에 대한 단항 연산자를 사용하여 모호한 오버로드 해결
제공된 코드 조각에서:
void foo(std::function<void()> f) { f(); } void foo(void (*f)()) { f(); } int main() { foo([]() {}); // ambiguous foo(+[]() {}); // resolves to function pointer overload }
첫 번째 foo에 대한 호출이 모호하여 컴파일에 실패했습니다. 이러한 모호함은 람다 표현식이 암시적으로 std::function
이 모호성을 해결하기 위해 두 번째 호출에서 람다 앞에 단항 연산자가 사용됩니다. 연산자는 람다 표현식을 두 번째 오버로드와 정확히 일치하는 함수 포인터 유형인 void(*)()로 변환합니다.
C 표준에 따르면:
따라서 []() {} 표현식은 두 번째 오버로드와 명확하게 일치하는 void (*)() 함수 포인터를 생성합니다.
람다 표현식이 다음을 수행할 수 있다는 점에 유의하는 것이 중요합니다. 또한 모호함을 피하기 위해 명시적으로 함수 포인터 유형으로 캐스팅해야 합니다.
foo((void (*)())([]() {}));
위 내용은 단항 연산자는 람다 표현식을 인수로 사용하여 함수를 호출할 때 모호성을 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!