关于 C++ 的问题模板

发布于 2024-10-15 12:47:05 字数 368 浏览 0 评论 0原文

假设如下模板定义(代码无意义):

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++ 模板的什么规则或规范允许这样做?看到它我很惊讶。

Suppose the following template definition (the code is meaningless):

template<class X, class Y>
bool FooBar(const Y& val) { return sizeof(X) + 4; }

I have found that following calling code was legal:

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

As you can see, the second type parameter Y can be omitted. A compiler infers the type of Y by looking the argument type of temp.

What rule or specification of C++ template allows this? I was pretty surprised to see it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

耶耶耶 2024-10-22 12:47:05

这就是模板实参推导;这与使用 X 作为 FooBar 的值参数的类型并在完全不使用任何模板参数的情况下调用它是一样的。有一个包含更多详细信息的文档 IBM 的编译器站点

That is template argument deduction; it is the same as if you used X as the type of a value parameter of FooBar and called it without any template arguments at all. There is a document with more details at IBM's compiler site.

骄傲 2024-10-22 12:47:05

14.7.1 第 2 段:

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

正如 Jeremiah 指出的,参数演绎是你真正要问的:

14.8.2:

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

该过程在那里详细描述。

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

14.7.1 Paragraph 2:

Unless a function template specialization has been explicitly instantiated or explicitly specialized, the function template specialization is implicitly instantiated when the specialization is referenced in a context that requires a function definition to exist.

As Jeremiah points out, argument deduction is what you're really asking about:

14.8.2:

When a template function specialization is referenced, all of the template arguments must have values. The values can be either explicitly specified or, in some cases, deduced from the use. ...

The process is described in detail there.

Source: ISO/IEC 14882:1998(E)

两人的回忆 2024-10-22 12:47:05

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

This is called 'implicit template instantiation'. See the standard, section 14.7.1. I would note that this is very commonly used for function templates.

你的往事 2024-10-22 12:47:05

您不一定需要指定每个类型参数。本质上,编译器根据传入参数的类型计算出 Y,并且您在声明中指定了 X。这只是 Java 和 C++ 之间的另一个区别。

You aren't necessarily required to specify each type parameter. Essentially, the compiler figures out Y from the type of the parameter passed in, and you specified X in your declaration. Just another difference between Java and C++.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文