クラス テンプレートのテンプレート引数の推論: 制限と影響
関数と関数のテンプレート引数の推論動作を統合する P0091 提案を受けてクラス テンプレートを使用すると、次のような疑問が生じます。なぜ部分的なクラス テンプレート引数の推論は不可能なのでしょうか?
最初の提案は、推論メカニズムを調整し、両方のコンテキストで部分的な推論を可能にすることを目的としていました。ただし、推定された値によって複数の有効なテンプレートの特殊化が生成される場合、潜在的な混乱が生じる可能性があるという懸念が生じました。典型的な例は、タプル型の推論です。引数を 1 つだけ指定すると、元のタプル定義に複数の要素が含まれている場合でも、コンパイラは 1 つの要素を持つタプルを推論できます。
このような曖昧さを防ぐために、部分的クラス テンプレートの引数の控除は提案から削除されました。この制限は、開発者が特定のテンプレート パラメータを明示的に指定し、その他のパラメータは推測に委ねたいというシナリオに影響します。
たとえば、次のクラス テンプレートを考えてみましょう。
template <std::size_t S, typename T> struct test { static constexpr auto size = S; using type_t = T; test(type_t (&input)[size]) : data(input) {} type_t (&data)[size]{}; };
ヘルパー関数は次のように機能します。テスト オブジェクトをインスタンス化するための糖衣構文:
template <std::size_t S, typename T> test<S, T> helper(T (&input)[S]) { return input; }
事前に宣言された配列でヘルパーを使用する場合:
int buffer[5]; auto a = helper<5, int>(buffer); // No deduction auto b = helper<5>(buffer); // Type deduced auto c = helper(buffer); // Type and size deduced
クラス テンプレートの場合、部分推論はサポートされません。 auto b = helper(buffer); の失敗によって証明されています。コンパイラは引数から T パラメータを推測できず、コンパイル エラーが発生します。代わりに、 auto c = helper(buffer); となります。 S と T の両方を正常に推定し、すべてのテンプレート パラメーターを明示的に指定する必要性を示しています。
以上が部分的なクラス テンプレートの引数の控除が不可能なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。