ホームページ  >  記事  >  バックエンド開発  >  テンプレート推定で暗黙的な型変換が失敗するのはなぜですか?

テンプレート推定で暗黙的な型変換が失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-31 19:31:30234ブラウズ

 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 の演繹ガイドを定義し、関数を呼び出します:

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

    このアプローチはデフォルトの演繹ガイドに依存しており、この場合はこれで十分です。

  • 明示的なインスタンス化: 必要な型の func テンプレートを明示的にインスタンス化します。

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

    これは、Scalar::Scalar(T) が明示的でない場合にのみ機能します。

結論として、テンプレート引数の推論はユーザーに自動的に適用されません。 -定義された変換。テンプレート引数の推論でユーザー定義の変換を使用するには、呼び出し元サイトで引数を明示的に変換するか、該当する場合は推論ガイドを使用するか、または目的の型のテンプレートを明示的にインスタンス化する必要があります。

以上がテンプレート推定で暗黙的な型変換が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。