尽管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<5>(buffer);)失败,表明确实不支持部分类模板参数推导。
此限制源于担忧提出了以下情况下潜在的混乱:
// Deduced as tuple<int, string, float> // but tuple<int> is also a valid type! tuple<int> t(42, "waldo", 2.0f);
因此,虽然该提案最初旨在统一推导行为,但类模板的部分推导仍然存在由于潜在的歧义问题而无法使用。
以上是为什么部分类模板参数推导仍然行不通?的详细内容。更多信息请关注PHP中文网其他相关文章!