类模板的部分模板参数推导:重新审视
尽管 P0091 中概述了统一函数和类模板行为的努力,但类模板中的部分参数推导仍然难以捉摸。本讨论阐明了当前的限制并探讨了其背后的潜在原因。
考虑类模板测试及其辅助函数 helper。虽然 helper 允许部分推导,如提供的代码所示,但相应的类模板测试却不允许。
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; }
经过实验,很明显,类模板推导仅在所有参数都显式时才会发生假如。这种与预期行为的偏差引发了对 P0091 的解释是否存在误解的问题。
正如 Botond Ballo 的旅行报告所暗示的那样,提出了对类模板的部分扣除,但由于担心混淆,后来又撤回了。例如,以下代码将导致对 tuple
tuple<int> t(42, "waldo", 2.0f);
为了避免这种歧义,必须为类模板提供完整的模板参数集,而部分推导仍然是函数模板的一个选项。
以上是为什么我们不能部分推导类模板的模板参数?的详细内容。更多信息请关注PHP中文网其他相关文章!