一个关于C++模板的问题

3
假设以下模板定义(代码无意义):
template<class X, class Y>
bool FooBar(const Y& val) { return sizeof(X) + 4; }

我发现以下调用代码是合法的:

float temp = 0.f;
FooBar<int>(temp);

如您所见,第二个类型参数Y可以省略。编译器通过查看temp的参数类型来推断Y的类型。

C++模板的哪个规则或规范允许此操作?我非常惊讶看到它。

4个回答

5
那是模板参数推导;这就像你在FooBar的值参数中使用X类型并且没有使用任何模板参数一样。有一个更详细的文档可以在IBM编译器网站上找到。

3

14.7.1第2段:

除非函数模板特化已经被显式实例化或显式专门化,否则当在需要存在函数定义的上下文中引用特化时,函数模板特化将被隐式实例化。

正如Jeremiah所指出的,参数推导才是你真正关心的内容:

14.8.2:

当引用模板函数特化时,所有模板参数都必须具有值。这些值可以是显式指定的,也可以在某些情况下从使用中推断出来。...

该过程在那里详细描述。

来源:ISO/IEC 14882:1998(E)


1
当模板参数已知时,就会发生这种情况。通过模板参数推导来获取参数。 - Jeremiah Willcock
你说得对,第14.8.2节明确描述了扣除过程。 - Mike Mueller

1
这被称为“隐式模板实例化”。请参见标准,第14.7.1节。我想指出,这在函数模板中非常常用。

1
实例化是编译器生成函数体的副本来运行,但并不涉及如何获取用于调用的模板参数。 - Jeremiah Willcock

1

你不一定需要指定每个类型参数。实际上,编译器会从传递的参数类型中推断出 Y,而你在声明中指定了 X。这只是 Java 和 C++ 之间的另一个区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接