> 백엔드 개발 > C++ > SFINAE가 반환 유형에서는 실패하지만 템플릿 매개변수에서는 성공하는 이유는 무엇입니까?

SFINAE가 반환 유형에서는 실패하지만 템플릿 매개변수에서는 성공하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-13 07:27:10
원래의
1042명이 탐색했습니다.

Why Does SFINAE Fail in Return Types but Succeed with Template Parameters?

반환 유형과 템플릿 매개변수의 SFINAE

정수와 부동 소수점 숫자를 구별하는 함수 템플릿 foo가 있다고 가정합니다.

template<typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void;

template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void;
로그인 후 복사

그러나 이 코드는 double로 호출하면 오류와 함께 실패합니다. value:

foo(3.4);
// Error: no matching function for call to 'foo(double)'
로그인 후 복사

이 접근 방식이 실패하는 이유는 무엇입니까?

이 경우 SFINAE는 foo의 반환 유형을 조건부로 정의하는 데 사용됩니다. 그러나 이는 기본 템플릿 인수를 고려하지 않는 함수 템플릿 오버로드 규칙을 위반합니다. 결과적으로 컴파일러는 두 foo 템플릿을 동일한 시그니처를 가진 동일한 함수로 처리합니다.

식 참조 템플릿 매개변수를 사용하는 대체 접근 방식

이 문제를 해결하려면 대신 다음을 수행할 수 있습니다. 반환 유형에서 템플릿 매개변수를 참조하는 표현식을 사용하십시오.

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type;

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type;
로그인 후 복사

이 수정을 통해 표현식 std::enable_if는 다음과 같습니다. SFINAE가 두 개의 foo 템플릿을 구별할 수 있도록 함수 서명의 일부입니다.

따라서 foo의 두 번째 버전은 올바르게 작동하지만 첫 번째 버전은 오류를 발생시킵니다.

위 내용은 SFINAE가 반환 유형에서는 실패하지만 템플릿 매개변수에서는 성공하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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