ホームページ >バックエンド開発 >C++ >クラス テンプレートの引数を部分的に控除できないのはなぜですか?

クラス テンプレートの引数を部分的に控除できないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-18 05:15:02216ブラウズ

Why Can't We Have Partial Class Template Argument Deduction?

部分的なクラス テンプレートの引数の推論: 不可能な理由

クラス テンプレートのテンプレート引数の推論を導入するこれまでの取り組みは、クラス テンプレートの動作を関数テンプレートの動作と一致させることを目的としていました。ただし、P0091 提案のリリースにより、重要な制限が明らかになりました。部分的なクラス テンプレート引数の推論は依然として不可能です。

クラス テンプレート テストが定義されている、提供された例を考えてみましょう。さまざまな形式の引数推論が示されているコード スニペットで明らかなように、ヘルパー関数 helper はテスト オブジェクトの作成を簡素化します。

ほとんどの場合、コードはコンパイルされますが、クラス テンプレートの部分的な推論を試行すると問題が発生します。たとえば、次のコードの 6 行目はコンパイルに失敗します:

int buffer[5];

test<5> b(buffer);      // Type deduced: FAILS.

これは、コンパイラが型パラメータ T を決定できないために発生します。明示的に指定しないと、コンパイラはすべてのテンプレート引数が同時に推定されることを期待します。 。各パラメータの推論プロセスが他のパラメータの推論に影響を与える可能性があるため、これは課題を引き起こします。

Botond Ballo によるレポートでは、この制限の背後にある理論的根拠が強調されています。

当初提案されていた機能には次のものが含まれていました。部分演繹の規定。テンプレート引数の一部を明示的に指定し、残りは演繹するままにします。ただし、これは、一部の項目で非常に混乱を招く可能性があるという懸念から撤回されました。 case:

// Would have deduced tuple<int, string, float>,
// but tuple<int> is a well-formed type in and of itself!
tuple<int> t(42, "waldo", 2.0f);

したがって、関数テンプレートでは引数の部分演繹が可能ですが、クラス テンプレートの部分演繹によって導入されるあいまいさにより、それが除外されます。

以上がクラス テンプレートの引数を部分的に控除できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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