>  기사  >  백엔드 개발  >  템플릿 추론에서 암시적 유형 변환이 실패하는 이유는 무엇입니까?

템플릿 추론에서 암시적 유형 변환이 실패하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-31 19:31:30231검색

 Why Does Implicit Type Conversion Fail in Template Deduction?

템플릿 추론에서 암시적 유형 변환

C에서 암시적 유형 변환 메커니즘은 템플릿 인수 추론에서 중요한 역할을 합니다. 그러나 특정 시나리오에서는 아래 코드 조각에 설명된 것처럼 예기치 않은 동작이 발생할 수 있습니다.

<code class="cpp">#include<iostream>
using namespace std;

template<typename Dtype>
class Scalar{
public:
  Scalar(Dtype v) : value_(v){}
private:
  Dtype value_;
};

template<typename Dtype>
void func(int a, Scalar<Dtype> b){ 
  cout << "ok" << endl;
}

int main(){
  int a = 1;
  func(a, 2); // Incorrect conversion
  //int b = 2;
  //func(a, b); // Also incorrect
  return 0;
}

제공된 코드에서 목표는 암시적으로 int를 다음으로 변환하여 템플릿 함수 func를 호출하는 것입니다. Scalar; 물체. 그러나 놀랍게도 func(a, 2)에 대한 첫 번째 호출에 대한 템플릿 인수 추론/대체 실패로 인해 코드가 컴파일되지 않습니다.

이 실패의 이유는 템플릿 인수 추론이 사용자를 고려하지 않기 때문입니다. 정의된 전환. 이 시나리오에서는 int에서 Scalar 템플릿 인수 추론 중에 자동으로 적용되지 않는 사용자 정의 변환입니다.

이 문제를 해결하려면 다음과 같은 몇 가지 옵션이 있습니다.

  • 명시적 변환 발신자 사이트에서: Scalar 호출 사이트에서 원하는 값을 가진 객체:

    <code class="cpp">func(a, Scalar<int>{2}); </code>
  • 추론 가이드: Scalar에 대한 추론 가이드 정의 및 func 호출:

    <code class="cpp">func(a, Scalar{2}); // C++17 only</code>

    이 접근 방식은 이 경우에 충분한 기본 추론 가이드에 의존합니다.

  • 명시적 인스턴스화: 원하는 유형에 대해 func 템플릿을 명시적으로 인스턴스화합니다.

    <code class="cpp">func<int>(a, 2); </code>

    Scalar::Scalar(T)가 명시적이지 않은 경우에만 작동합니다.

결론적으로 템플릿 인수 추론은 사용자에게 자동으로 적용되지 않습니다. -정의된 변환. 템플릿 인수 추론에서 사용자 정의 변환을 사용하려면 호출자 사이트에서 인수를 명시적으로 변환하거나 해당하는 경우 추론 가이드를 사용하거나 원하는 유형에 대한 템플릿을 명시적으로 인스턴스화해야 합니다.

위 내용은 템플릿 추론에서 암시적 유형 변환이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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