テンプレート推論における暗黙的な型変換
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 この失敗の背後にある理由は、テンプレート引数の推論がユーザーのパラメータを考慮していないためです。定義された変換。このシナリオでは、int から Scalar この問題を解決するには、いくつかのオプションがあります。 明示的な変換呼び出し側サイト: Scalar 演繹ガイド: Scalar の演繹ガイドを定義し、関数を呼び出します: このアプローチはデフォルトの演繹ガイドに依存しており、この場合はこれで十分です。 明示的なインスタンス化: 必要な型の func テンプレートを明示的にインスタンス化します。 これは、Scalar 結論として、テンプレート引数の推論はユーザーに自動的に適用されません。 -定義された変換。テンプレート引数の推論でユーザー定義の変換を使用するには、呼び出し元サイトで引数を明示的に変換するか、該当する場合は推論ガイドを使用するか、または目的の型のテンプレートを明示的にインスタンス化する必要があります。 以上がテンプレート推定で暗黙的な型変換が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
<code class="cpp">func(a, Scalar<int>{2}); </code>
<code class="cpp">func(a, Scalar{2}); // C++17 only</code>
<code class="cpp">func<int>(a, 2); </code>