我有一个带有两个模板参数的模板功能。
根据传递给函数的第一个参数的类型推导出第一个(T
)。通过使用ItrT
和std::type_traits
来推导第二个(T
)。
当我使用ItrT
作为参数的类型(请参见函数bar
)时,所有类型都是隐式推导的,但是当我使用std::function<void(ItrT)>
作为参数的类型(请参见函数{{ 1}}),只有在完全指定所有模板参数时才能推断出正确的类型(即使使用与函数定义中完全相同的代码也是如此)。可以想象在模板中使用foo
不会改变编译器推断模板的能力。为什么不这样呢?我需要做什么,以便可以隐式推导所有模板参数?
我正在使用c ++ 17。
ItrT
非常感谢。
答案 0 :(得分:2)
我猜这里的困惑在于默认模板参数的作用。
规则不是:尝试推导参数。如果推导失败,则使用默认值(如果提供)。
相反,规则是:如果参数在推导的上下文中,则推导它。如果推导失败,则中止。如果它不在推论上下文中,并且未明确提供,则使用默认参数。换句话说,仅当该参数既不在推论上下文中也不显式提供时,才使用默认参数。
在您的两个示例中,ItrT
都在推论的上下文中,因此根本不考虑默认模板参数。两者之间的区别在于,您可以可以从lambda推论T
(只需匹配其类型),而您不能从lambda推论function<void(T)
lambda-lambda可以转换到适当的function
,但是lambda 不是 function
。模板推导不执行转换。模板推导仅与模式匹配。