假设以下模板定义(代码没有意义):
template<class X, class Y>
bool FooBar(const Y& val) { return sizeof(X) + 4; }
我发现以下调用代码是合法的:
float temp = 0.f;
FooBar<int>(temp);
如您所见,可以省略第二个类型参数Y
。编译器通过查看Y
的参数类型来推断temp
的类型。
C ++模板的规则或规范允许这样做?我很惊讶地看到它。
答案 0 :(得分:5)
这是模板参数推导;它就像你使用X
作为FooBar
的值参数的类型一样,并且在没有任何模板参数的情况下调用它。在IBM's compiler site有一个更详细的文档。
答案 1 :(得分:3)
除非已明确实例化或明确专门化了函数模板特化,否则在需要存在函数定义的上下文中引用特化时,将隐式实例化函数模板特化。
正如耶利米指出的那样,论证演绎是你真正询问的:
14.8.2:
引用模板函数特化时,所有模板参数都必须具有值。可以明确指定值,或者在某些情况下,从使用中推断出值。 ...
该过程在那里有详细描述。
资料来源:ISO / IEC 14882:1998(E)
答案 2 :(得分:1)
这称为“隐式模板实例化”。参见标准,第14.7.1节。我会注意到这通常用于功能模板。
答案 3 :(得分:1)
您无需指定每个类型参数。本质上,编译器根据传入的参数类型计算出Y,并在声明中指定了X. Java和C ++之间的另一个区别。