>백엔드 개발 >C++ >C 함수 오버로드에서 SFINAE 동작은 반환 유형과 템플릿 매개변수 사이에서 어떻게 다릅니까?

C 함수 오버로드에서 SFINAE 동작은 반환 유형과 템플릿 매개변수 사이에서 어떻게 다릅니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-27 04:43:51634검색

How Does SFINAE Behavior Differ Between Return Types and Template Parameters in C   Function Overloads?

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.