之前为类模板引入模板参数推导的努力旨在使其行为与函数模板的行为保持一致。然而,P0091 提案的发布揭示了一个关键限制:部分类模板参数推导仍然不可能。
考虑提供的示例,其中定义了类模板测试。辅助函数 helper 简化了测试对象的创建,如演示各种形式的参数推导的代码片段所示。
虽然代码在大多数情况下都能编译,但在尝试对类模板进行部分推导时会出现困难。例如,以下代码的第 6 行无法编译:
int buffer[5]; test<5> b(buffer); // Type deduced: FAILS.
出现这种情况是因为编译器无法确定类型参数 T。如果没有显式指定,编译器希望同时推导所有模板参数。这带来了挑战,因为每个参数的推导过程都会影响其他参数的推导。
Botond Ballo 的报告强调了此限制背后的基本原理:
最初提出的功能包括部分推导的规定,您可以显式指定一些模板参数,并保留其余部分进行推导,但这是因为担心在某些情况下可能会非常混乱:
// 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中文网其他相关文章!