반환 유형과 템플릿 매개변수의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!