動作を調整するという P0091: クラス テンプレートのテンプレート引数の推論 提案の意図にもかかわらず関数テンプレートとクラス テンプレートを使用する場合、クラス テンプレートの部分推論は依然として機能しません。
クラス テンプレートを考慮してください:
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: FAILS auto c = helper(buffer); // Type and size deduced
は正常にコンパイルされます。ただし、より最近のコンパイラ バージョンでは、部分的な推論 (つまり、auto b = helper(buffer);) が失敗し、部分的なクラス テンプレート引数の推論が実際にはサポートされていないことが示唆されます。
この制限は懸念から生じています。次のような場合の潜在的な混乱に関して提起されました。
// Deduced as tuple<int, string, float> // but tuple<int> is also a valid type! tuple<int> t(42, "waldo", 2.0f);
したがって、この提案は当初推論動作を統一することを目的としていましたが、潜在的な曖昧さの問題により、クラス テンプレートの部分的な推論は依然として実行不可能です。
以上が部分的なクラス テンプレート引数の演繹が依然として機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。