ホームページ >バックエンド開発 >C++ >C が推定不可能なコンテキストでテンプレート引数を推定できないのはなぜですか?

C が推定不可能なコンテキストでテンプレート引数を推定できないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-26 13:47:10889ブラウズ

Why Can't C   Deduce Template Arguments in Non-Deducible Contexts?

なぜ C は推定不可能なコンテキストで T を推定できないのですか?

指定されたコード スニペットでは、テンプレート構造体 TMap は次のように定義されています。ネストされた型 テンプレート引数 T を使用して std::map の特殊化を表す型。ただし、コンパイラは推定に失敗します。関数 test 内の T。

Non-Deducible Context

コードが型 typename TMap:: を持つ引数を指定して test を呼び出すため、エラーが発生します。 & と入力します。T は明示的に指定されていません。この状況は、推論不可能なコンテキストと呼ばれます。

型推論のあいまいさ

推論不可能なコンテキストでは、コンパイラは次のようになります。引数の型が T を一意に決定しないため、テンプレート引数を推論できません。たとえば、次のことを考えてください。 scenario:

template <>
struct TMap<SomeType> {
  typedef std::map<double, double> Type;
};

template <>
struct TMap<OtherType> {
  typedef std::map<double, double> Type;
};

この場合、TMap::Type と TMap::Type は両方とも std::map と同一です。したがって、コンパイラは T が SomeType であるか OtherType であるかを推論できません。

結果

推論不可能なコンテキストの制限には重要な意味があります。

  • コンパイラが、渡された引数の型に基づいてテンプレートを暗黙的に特殊化することを防ぎます。関数。
  • ジェネリック型を引数として関数を呼び出す場合は、明示的なテンプレート引数の推論または明示的なテンプレート引数の指定が必要です。

軽減策

この制限を軽減するには、テンプレートのテンプレート引数や C 20 の std::is_same_v などの手法を使用して手動で推定することができます。テンプレート引数を指定するか、明示的なテンプレート パラメーター リストを指定します。

以上がC が推定不可能なコンテキストでテンプレート引数を推定できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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