>백엔드 개발 >C++ >`const char*` 함수 오버로드가 `const char (&)[N]` 템플릿 함수보다 우선하는 이유는 무엇입니까?

`const char*` 함수 오버로드가 `const char (&)[N]` 템플릿 함수보다 우선하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-26 18:04:08689검색

Why Does a `const char*` Function Overload Prevail Over a `const char (&)[N]` Template Function?

오버로딩 충돌: 포인터 붕괴 대 템플릿 추론

질문:

함수가 유형의 매개변수를 사용하는 이유는 무엇입니까? const char*는 const char (&s)[N] 유형의 매개변수가 있는 함수 템플릿보다 우선합니다. 동일하게 적용 가능합니까?

근본 원인:

모호함은 전환의 상대적 비용에서 비롯됩니다. 과부하 해결은 변환 작업이 덜 필요한 기능을 선호합니다. 배열은 사실상 첫 번째 요소에 대한 포인터입니다. 이는 배열 기반 함수 템플릿을 선언하는 것보다 배열에서 포인터로의 변환 비용이 저렴하다는 것을 의미합니다.

표준 설명:

C 표준에 따르면 ([over.match.best]/(1.3), (1.6)):

  • 특수 함수 템플릿보다 비특수 함수가 선호됩니다.
  • 두 변환의 순위가 동일하면 구별할 수 없습니다.

이 경우:

  • 배열에서 포인터로의 변환은 다음과 같습니다. 정확히 일치 순위가 있는 Lvalue 변환.
  • Lvalue 변환을 제외하면 변환 순위는 중요하지 않습니다.
  • 따라서 두 변환 순서 모두 더 좋지 않아 char const* 오버로드가 모호해지고 선택됩니다. .

가능 해결 방법:

템플릿 기반 함수의 우선 순위를 지정하려면 두 번째 오버로드도 함수 템플릿으로 정의합니다.

template <typename T>
auto foo(T s)
    -> std::enable_if_t<std::is_convertible<T, char const*>{}>
{
    std::cout << "raw, size=" << std::strlen(s) << std::endl;
}

이 부분 순서 지정을 통해 템플릿 기반 함수는 해당되는 경우 선택하세요.

위 내용은 `const char*` 함수 오버로드가 `const char (&)[N]` 템플릿 함수보다 우선하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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