>백엔드 개발 >C++ >ADL(인수 종속 조회)이 명시적 템플릿 인수가 있는 함수 템플릿을 찾지 못하는 이유는 무엇입니까?

ADL(인수 종속 조회)이 명시적 템플릿 인수가 있는 함수 템플릿을 찾지 못하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-11 12:42:12419검색

Why Does Argument-Dependent Lookup (ADL) Fail to Find Function Templates with Explicit Template Arguments?

ADL 및 함수 템플릿

인수 종속 조회(ADL)는 함수와 개체의 자동 조회를 촉진하여 C에서 중요한 역할을 합니다. 사용된 인수 유형에 따라 연관된 네임스페이스에 있습니다. 그러나 이 메커니즘은 함수 템플릿과 관련하여 제한 사항이 있습니다.

ADL을 사용하여 함수 템플릿 찾기에 대한 제한

제공된 코드 조각의 마지막 호출이 컴파일에 실패합니다. C 사양의 제한사항입니다. C 표준 03의 섹션 14.8.1.6에 따르면:

"그러나 명시적인 템플릿 인수가 있는 함수 템플릿이 사용되는 경우 해당 이름을 가진 함수 템플릿이 표시되지 않는 한 호출은 올바른 구문 형식을 갖지 않습니다. "

이는 ADL이 호출 범위 내에서 표시되는 함수 템플릿만 찾을 수 있음을 의미합니다. 주어진 예에서, frob<0> 명시적인 템플릿 인수를 사용하여 함수 템플릿을 호출하는 것입니다. 그러나 main 호출 시점에는 Frob 템플릿의 선언이 눈에 띄지 않습니다.

단순 함수 이름과의 구별

단순 함수 이름에는 제한이 적용되지 않습니다. 함수 이름. 이러한 이름의 경우 호출 범위 내에 함수가 표시되지 않더라도 ADL이 사용됩니다. 이는 호출이 여전히 함수 호출의 구문 형식을 유지하기 때문입니다.

다음 예에서는 동작을 자세히 보여줍니다.

namespace A {
  struct B { };
  template<int X> void f(B);
}
namespace C {
  template<class T> void f(T t);
}
void g(A::B b) {
  f<3>(b);    //ill-formed: not a function call
  A::f<3>(b); //well-formed
  C::f<3>(b); //ill-formed; argument dependent lookup
              // applies only to unqualified names
  using C::f;
  f<3>(b);    //well-formed because C::f is visible; then
              // A::f is found by argument dependent lookup
}

이 예에서 f3(b)에 대한 호출은 f라는 이름의 가시적인 함수 템플릿이 존재하지 않기 때문에 형식이 잘못되었습니다. 가리키다. A::f3(b)에 대한 호출은 f 템플릿이 A 네임스페이스 내에서 표시되기 때문에 잘 구성되어 있습니다. C::f3(b)에 대한 호출은 ADL이 규정되지 않은 이름에만 적용되기 때문에 형식이 잘못되었습니다. 별칭 C::f에 using 지시어를 사용하면 f 이름이 이제 호출 시점에 표시되므로 f3(b)에 대한 호출이 올바른 형식으로 만들어집니다.

위 내용은 ADL(인수 종속 조회)이 명시적 템플릿 인수가 있는 함수 템플릿을 찾지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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