반환 유형과 템플릿 매개변수의 SFINAE 동작 차이
C에서 SFINAE(대체 실패는 오류가 아님) 관용구는 조건부 허용을 허용합니다. 템플릿 메타프로그래밍 및 유형 특성을 기반으로 한 함수 오버로드. 그러나 SFINAE가 함수 템플릿 선언의 배치에 따라 다르게 동작하는 경우가 있습니다.
다음 코드를 고려하세요.
template<typename T, typename = typename std::enable_if< std::is_integral<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T, typename = typename std::enable_if< std::is_floating_point<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_integral<T>::value>::type; template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_floating_point<T>::value>::type;
첫 번째 오버로드 세트(잘못된 배치)에서, 반환 유형이 아닌 템플릿 매개변수에 SFINAE를 배치하면 컴파일 오류가 발생합니다. 이는 오버로드 동등성을 결정할 때 기본 템플릿 인수(이 경우 ::type 접미사)가 고려되지 않기 때문입니다. 결과적으로 컴파일러는 함수를 동일한 시그니처를 가진 중복 선언으로 처리합니다.
그러나 두 번째 오버로드 세트(올바른 배치)에서는 SFINAE가 템플릿 메타프로그래밍과 관련된 반환 유형에 적용됩니다. 이 배치는 템플릿 매개변수를 참조하는 표현식이 함수 서명의 일부임을 보장합니다. 결과적으로 컴파일러는 오버로드를 별개의 엔터티로 인식하여 SFINAE가 제대로 작동할 수 있도록 합니다.
위 내용은 C 함수 오버로드에서 SFINAE 동작은 반환 유형과 템플릿 매개변수 사이에서 어떻게 다릅니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!